Sejujurnya, saya pikir pembuat fungsi ini tidak tahu apa itu injeksi XSS dan SQL atau apa sebenarnya fungsi yang digunakan.
Sekedar menyebutkan dua keanehan:
- Menggunakan
stripslashes
setelahmysql_real_escape_string
menghapus garis miring yang ditambahkan olehmysql_real_escape_string
. htmlentities
menggantikan chatacters<
dan>
yang digunakan distrip_tags
untuk mengidentifikasi tag.
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
- String JavaScript
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 menggunakanrawurlencode
untuk ini. - Untuk string JavaScript konteks kita perlu menjaga
"
,'
, dan\
. Kita dapat menggunakanjson_encode
untuk ini (jika tersedia). - Untuk nilai atribut HTML kita harus menjaga
&
,"
,'
, dan<
. Kita dapat menggunakanhtmlspecialchars
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("http://example.com/"%22bar%2Fbaz%22"")" …
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 "
. Dan tidak hanya menggunakan salah satu dari fungsi ini akan memungkinkan untuk memutus konteks.