Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Membersihkan teks yang dimasukkan pengguna secara efisien

Keamanan adalah konsep yang menarik dan menarik banyak orang untuk itu. Sayangnya ini adalah subjek yang kompleks dan bahkan para profesional pun salah. Saya telah menemukan celah keamanan di Google (CSRF), Facebook (lebih banyak CSRF), beberapa pengecer online besar (terutama injeksi SQL / XSS), serta ribuan situs kecil baik perusahaan maupun pribadi.

Ini rekomendasi saya:

1) Gunakan kueri berparameter
Kueri berparameter memaksa nilai yang diteruskan ke kueri untuk diperlakukan sebagai data terpisah, sehingga nilai input tidak dapat diuraikan sebagai kode SQL oleh DBMS. Banyak orang akan merekomendasikan agar Anda keluar dari string menggunakan mysql_real_escape_string() , tetapi bertentangan dengan kepercayaan populer, ini tidak solusi umum untuk injeksi SQL. Ambil kueri ini misalnya:

SELECT * FROM users WHERE userID = $_GET['userid']

Jika $_GET['userid'] diatur ke 1 OR 1=1 , tidak ada karakter khusus dan tidak akan difilter. Ini menghasilkan semua baris dikembalikan. Atau, lebih buruk lagi, bagaimana jika disetel ke 1 OR is_admin = 1 ?

Kueri berparameter mencegah injeksi semacam ini terjadi.

2) Validasi masukan Anda
Kueri berparameter sangat bagus, tetapi terkadang nilai yang tidak terduga dapat menyebabkan masalah dengan kode Anda. Pastikan Anda memvalidasi bahwa mereka berada dalam jangkauan dan tidak mengizinkan pengguna saat ini mengubah sesuatu yang seharusnya tidak dapat mereka lakukan.

Misalnya, Anda mungkin memiliki formulir perubahan kata sandi yang mengirimkan permintaan POST ke skrip yang mengubah kata sandinya. Jika Anda menempatkan ID pengguna mereka sebagai variabel tersembunyi dalam formulir, mereka dapat mengubahnya. Mengirim id=123 bukannya id=321 mungkin berarti mereka mengubah kata sandi orang lain. Pastikan SEMUANYA divalidasi dengan benar, dalam hal jenis, jangkauan, dan akses.

3) Gunakan htmlspecialchars untuk menghindari masukan pengguna yang ditampilkan
Misalnya pengguna Anda memasukkan "tentang saya" seperti ini:
</div><script>document.alert('hello!');</script><div>
Masalahnya adalah output Anda akan berisi markup yang dimasukkan pengguna. Mencoba memfilter ini sendiri dengan daftar hitam adalah ide yang buruk. Gunakan htmlspecialchars untuk memfilter string sehingga tag HTML dikonversi menjadi entitas HTML.

4) Jangan gunakan $_REQUEST
Serangan pemalsuan permintaan lintas situs (CSRF) bekerja dengan membuat pengguna mengklik tautan atau mengunjungi URL yang mewakili skrip yang melakukan tindakan di situs tempat mereka masuk. $_REQUEST variabel adalah kombinasi dari $_GET , $_POST dan $_COOKIE , yang berarti Anda tidak dapat membedakan antara variabel yang dikirim dalam permintaan POST (yaitu melalui input tag di formulir Anda) atau variabel yang ditetapkan di URL Anda sebagai bagian dari GET (mis. page.php?id=1 ).

Katakanlah pengguna ingin mengirim pesan pribadi ke seseorang. Mereka mungkin mengirim permintaan POST ke sendmessage.php , dengan to , subject dan message sebagai parameter. Sekarang bayangkan seseorang mengirim permintaan GET sebagai gantinya:

sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!

Jika Anda menggunakan $_POST , Anda tidak akan melihat salah satu dari parameter tersebut, karena parameter tersebut disetel di $_GET sebagai gantinya. Kode Anda tidak akan melihat $_POST['to'] atau variabel lainnya, sehingga tidak akan mengirim pesan. Namun, jika Anda menggunakan $_REQUEST , $_GET dan $_POST terjebak bersama, sehingga penyerang dapat mengatur parameter tersebut sebagai bagian dari URL. Saat pengguna mengunjungi URL itu, mereka secara tidak sengaja mengirim pesan. Bagian yang benar-benar mengkhawatirkan adalah pengguna tidak perlu melakukan apa pun. Jika penyerang membuat halaman berbahaya, halaman tersebut dapat berisi iframe yang menunjuk ke URL. Contoh:

<iframe src="http://yoursite.com/sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!">
</iframe>

Hal ini mengakibatkan pengguna mengirim pesan kepada orang-orang tanpa pernah menyadari bahwa mereka melakukan sesuatu. Untuk alasan ini, Anda harus menghindari $_REQUEST dan gunakan $_POST dan $_GET sebagai gantinya.

5) Perlakukan semua yang Anda berikan sebagai hal yang mencurigakan (atau bahkan berbahaya)
Anda tidak tahu apa yang dikirimkan pengguna kepada Anda. Itu bisa sah. Itu bisa menjadi serangan. Jangan pernah mempercayai apa pun yang dikirim pengguna kepada Anda. Konversikan ke jenis yang benar, validasi input, gunakan daftar putih untuk memfilter jika perlu (hindari daftar hitam). Ini termasuk apa pun yang dikirim melalui $_GET , $_POST , $_COOKIE dan $_FILES .



Jika Anda mengikuti panduan ini, Anda berada pada posisi yang wajar dalam hal keamanan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP Cara terbaik untuk men-cache hasil MySQL?

  2. Bagaimana cara meretas MySQL GROUP_CONCAT untuk mengambil sejumlah baris?

  3. Tolong contoh koneksi JavaFX MySQL

  4. Kesalahan MySQL - Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang

  5. Mysql menghitung kemunculan berdasarkan grup