最近在使用框架的時候仍是有點不安,不知道框架的設計者有沒有考慮到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