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

Apakah kedua fungsi ini berlebihan untuk sanitasi?

Sejujurnya, saya pikir pembuat fungsi ini tidak tahu apa itu injeksi XSS dan SQL atau apa sebenarnya fungsi yang digunakan.

Sekedar menyebutkan dua keanehan:

Selanjutnya:Secara umum, fungsi yang melindungi terhadap XSS tidak cocok untuk melindungi dari injeksi SQL dan sebaliknya. Karena setiap bahasa dan konteks memiliki karakter khusus yang perlu diperhatikan.

Saran saya adalah mempelajari mengapa dan bagaimana injeksi kode dimungkinkan dan bagaimana melindunginya. Pelajari bahasa yang Anda gunakan, terutama karakter khusus dan cara menghindarinya.

Sunting Berikut beberapa contoh (mungkin aneh):Bayangkan Anda mengizinkan pengguna Anda memasukkan beberapa nilai yang harus digunakan sebagai segmen jalur di URI yang Anda gunakan di beberapa kode JavaScript di onclick nilai atribut. Jadi konteks bahasanya seperti ini:

  • Nilai atribut HTML
    • String JavaScript
      • Segmen jalur URI

Dan untuk membuatnya lebih menyenangkan:Anda menyimpan nilai input ini dalam database.

Sekarang untuk menyimpan nilai input ini dengan benar ke dalam database Anda, Anda hanya perlu menggunakan pengkodean yang tepat untuk konteks Anda akan memasukkan nilai itu ke dalam bahasa database Anda (yaitu SQL); sisanya tidak masalah (belum). Karena Anda ingin memasukkannya ke dalam deklarasi string SQL, karakter khusus kontekstual adalah karakter yang memungkinkan Anda mengubah konteks itu. Adapun deklarasi string karakter ini (terutama) " , ' , dan \ karakter yang harus di-escape. Tetapi seperti yang telah dinyatakan, pernyataan yang disiapkan melakukan semua itu untuk Anda, jadi gunakanlah.

Sekarang setelah Anda memiliki nilai dalam database Anda, kami ingin menampilkannya dengan benar. Di sini kita melanjutkan dari konteks terdalam hingga terluar dan menerapkan pengkodean yang tepat di setiap konteks:

  • Untuk segmen jalur URI konteks kita perlu melepaskan (setidaknya) semua karakter yang memungkinkan kita mengubah konteks itu; dalam hal ini / (meninggalkan segmen jalur saat ini), ? , dan # (keduanya meninggalkan konteks jalur URI). Kita dapat menggunakan rawurlencode untuk ini.
  • Untuk string JavaScript konteks kita perlu menjaga " , ' , dan \ . Kita dapat menggunakan json_encode untuk ini (jika tersedia).
  • Untuk nilai atribut HTML kita harus menjaga & , " , ' , dan < . Kita dapat menggunakan htmlspecialchars untuk ini.

Sekarang semuanya bersama-sama:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

Sekarang jika $row['user-input'] adalah "bar/baz" keluarannya adalah:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

Tetapi menggunakan semua fungsi ini dalam konteks ini tidak berlebihan. Karena meskipun konteksnya mungkin memiliki karakter khusus yang serupa, mereka memiliki urutan pelarian yang berbeda. URI memiliki apa yang disebut penyandian persen, JavaScript memiliki urutan keluar seperti \" dan HTML memiliki referensi karakter seperti &quot; . Dan tidak hanya menggunakan salah satu dari fungsi ini akan memungkinkan untuk memutus konteks.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL SELECT AS menggabungkan dua kolom menjadi satu

  2. Pernyataan tunggal MySQL untuk menggabungkan dua tabel

  3. Bagaimana cara menampilkan data dari mysql menggunakan angular.js PHP?

  4. apakah `tanggal` nama kolom mysql yang valid?

  5. MySQL:Tidak dapat membuat tabel (errno:150)