PHP 關於SQL注入的防範措施。

    最近在使用框架的時候仍是有點不安,不知道框架的設計者有沒有考慮到SQL-Injection的問題,我在頂層需不須要作一些必要的過濾等等,由此我特地的去StackOverflow看了下,真是獲益良多,而後我去看了下框架的DB庫的內部方法,而後就比較安心了。分享下國內外PHP程序員在處理SQL-Injection的一些方案。php


    國外廣泛都推薦,只要你是使用查詢都應該作到兩點:1.prepared statements(準備好的聲明) 2.parameterized queries (參數化的查詢請求)mysql

我一開始也不理解這個是什麼意思,後來看他們舉例就大概知道了。比較安全的SQL,你須要一開始對查詢的變量進行準備。如:程序員

$name = $_POST['name'];
$sql = 'select * from user where name'.$name;

那麼最好就是對$name先處理下,sql

$name = mysql_real_escape_string($_POST['name']);
//

而後,讓請求過來的變量成爲參數,而不是SQL語言自己。安全

$sql = 'select * from user where name=\''.$name.'\'';

固然,這種寫法仍是比較粗糙。框架

因此,通常都會推薦使用PDO 或者是MYSQLI的prepare() excute()方法。.net

$stmt = $pdo->prepare('SELECT * FROM user WHERE name = :name');
$stmt->execute(array('name' => $name));

關於PDO::prepare()
設計

這樣作的好處就是,你再也不須要擔憂查詢請求會插入一些SQL語句,由於這些語句都將會看成是請求變量(一個字符串或者是數字),再也不會誤覺得是SQL語言自己。這樣能夠大大的減小SQL注入的機會。code

相關文章
相關標籤/搜索