駭客的填字遊戲,是一種攻擊行為。
在輸入的字串之中夾帶SQL指令,在未防範下,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵,進而竊取資料。
原本的程式碼:
select * from users where username= '%s' and password = '%s', $username
如果改成以下,可以拿到全部的users資料:
// 1=1 永遠都是 true
select * from users where username= '' or 1=1#,
所以如果駭客只要輸入 username 為 ' or 1=1#
及 password 為 123,即可拿到全部的 users 資料
// # 為註解,所以 # 之後的都被當作註解,不會執行
// 如果 username 是空字串,或是 1=1, 就會 select users 的全部資料
select * from users where username= '' or 1=1#' and password = '123', $username
原本新增留言的程式碼:
insert into comments(nickname, content)
values('%s', '%s')
如果輸入 nickname:a
, content:'),('admin','test')
,就可以一次新增兩筆留言,一筆是 a 留得空字串, 另一筆是 admin 留的 test。
insert into comments(nickname, content)
values('a', ''),('admin','test')')
Prepared Statement
可以防止 SQL注入攻擊
原本的登入程式碼可以改成:
$sql = "insert into users(nickname, username, password)
values(?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('sss', $nickname, $username, $password);
$result = $stmt->execute();