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.