Rumah  >  Artikel  >  pangkalan data  >  Membawa anda memahami SQL Injection dalam satu minit

Membawa anda memahami SQL Injection dalam satu minit

醉折花枝作酒筹
醉折花枝作酒筹ke hadapan
2021-08-02 16:01:222061semak imbas

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.

Membawa anda memahami SQL Injection dalam satu minit

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

Suntikan melalui ORM

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

Kaedah pencegahan

  • 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

Bagaimana kenyataan yang disediakan menghalang SQL Injection

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!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam