Dengan memasukkan arahan SQL ke dalam penyerahan borang Web atau memasukkan nama domain atau rentetan pertanyaan untuk permintaan halaman, anda akhirnya boleh menipu pelayan untuk melaksanakan perintah SQL yang berniat jahat. Secara khusus, ia menggunakan aplikasi sedia ada untuk menyuntik perintah SQL (berniat jahat) ke dalam enjin pangkalan data latar belakang untuk pelaksanaan, dengan itu mendapatkan pangkalan data pada tapak web dengan kelemahan keselamatan.
SQL Injection, SQL injection, sebenarnya adalah penggunaan kelemahan kod untuk menukar semantik SQL, dengan itu membentuk pernyataan SQL yang berniat jahat
$username = $_POST['username']; $password = $_POST['password']; $query = "select * from users where username = '{$username}' and password = '{$password}'"; // 判断是否登录成功 if (DB::select($query)) { return true; } return false;
Ambil lihat perenggan ini Tidak ada yang salah dengan pseudokod Ia hanya menentukan sama ada kata laluan akaun adalah betul, ia mengembalikan benar dan membenarkan log masuk. Tetapi jika nama pengguna masuk ialah 123' atau 1=1;#, maka pernyataan SQL menjadi
select * from users where username = '123' or 1=1; # and password = '{$password}'";
Pernyataan SQL berniat jahat ini akan kembali benar pada bila-bila masa, kerana 1=1
Kami telah menyebut sebelum ini bahawa SQL Injection menggunakan kelemahan kod untuk menukar semantik SQL, yang bermaksud bahawa ORM juga merupakan titik suntikan yang berpotensi. Mengambil tp3.2 sebagai contoh, terdapat kod berikut
$result = D('User')->where([ 'username' => $_POST['username'], 'password' => $_POST['password'], ]); if ($result) { echo '登录成功'; } else { echo '登录失败'; }
Kod ini nampaknya tiada masalah, tetapi jika nama pengguna dihantar dalam nama pengguna[0]=neq&nama pengguna[1]=1111, Dalam ini cara, pernyataan pertanyaan menjadi
$result = D('User')->where([ 'username' => ['neq', 111], 'password' => $_POST['password'], ]);
, maka hasil $result akan sentiasa benar
untuk parameter masuk Lakukan pertimbangan jenis data dan penukaran jenis data
Escape tanda petikan, PHP boleh menggunakan addslashes, mysql_real_escape_string dan fungsi lain
penyata prapemprosesan, Yang paling cara yang berkesan untuk mencegah SQL Injection
Audit kod
Pernyataan yang disediakan Dilaksanakan oleh pangkalan data, seperti MySQL, yang melaksanakan pernyataan yang disediakan. Mula-mula, mari kita bincangkan tentang proses asas prapemprosesan
MySQL menerima Templat SQL prapemprosesan dan serta-merta memulakan penghuraian (leksikal dan sintaks)
Pelanggan Hantar data ke penghujung untuk menggantikan pemegang tempat (?) dalam Templat SQL
MySQL melaksanakan pernyataan dan mengembalikan hasilnya
Padam pernyataan yang disediakan (Pilihan)
Jadi bagaimanakah kenyataan yang disediakan menghalang suntikan SQL? Pertama sekali, apa yang dipanggil SQL Injection adalah untuk menukar secara paksa semantik SQL. Dalam langkah satu, pernyataan telah diproses dan semantik SQL telah ditetapkan Menggantikan ruang letak dalam langkah dua tidak akan mengubah semantik SQL. Berikut ialah contoh PHP PDO
$stmt = $pdo->prepare("select * from users where username = '?' and password = '?'"); $stmt->execute("123' or 1=1;#", 'test');
Cadangan berkaitan: "tutorial mysql"
Atas ialah kandungan terperinci Membawa anda memahami SQL Injection dalam satu minit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!