[PHP] SQL Injection 防範

  • 8104
  • 0
  • PHP
  • 2017-02-12

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()

這個些方法也可以囉,
有興趣的朋友可以自行參考下.
有時間我再發文補充.