SQL Injection是多年來常常遇到的問題,
很多駭客入門都是從這邊入手的.
可從前端使用者傳入的字串或者參數傳入, 導致程式執行跳脫字元導致壞掉.
甚至可以測試出程式中的其他table資訊.
甚至shutdown 資料庫主機就不妙了.
以這個例子為例,
<?php
$_lastname = "O'Reilly";
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
資料庫會把執行的動作拆成兩句
[SELECT * FROM actors WHERE last_name = 'O']
[Reilly']
後面 [Reilly'] 這句就會造成異常.
若駭客把 [O'Really] 字串改成 [O' SELECT * FROM actors WHERE ''=']
執行完就會變成
[SELECT * FROM actors WHERE last_name = 'O']
[SELECT * FROM actors WHERE ''='']
就可以把 table action 裡面的資料全部套出來.
作法其實相當簡單.
這邊附上官網的解法.
http://php.net/manual/en/function.mysql-real-escape-string.php
滿簡單的, 就是一個function mysql_real_escape_string()
PHP版本大於4.3即可使用.
<?php
// We have not connected to MySQL
$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
更新:
bind_param()
addslashes()
mysql_escape_string()
這個些方法也可以囉,
有興趣的朋友可以自行參考下.
有時間我再發文補充.