2013-06-01 48 views
1

我是新來的PDO類,自從我剛纔使用MYSQLI,我有點困惑。這個問題相當簡單,但我無法在手冊中的任何地方直接找到答案。所以調用$pdo->query(some query)將自動轉義查詢,並且不會留下任何空間用於任何類型的潛在注入。這是真的?Php PDO查詢安全

+0

號這就是爲什麼你不能在手動 –

+0

好找吧,我怎麼逃脫查詢呢?如果我運行prepare()然後查詢()它會引發錯誤。 –

+0

http://stackoverflow.com/tags/pdo/info –

回答

4

不,這是不正確的。

爲了避免mysql injections任何風險,你需要或者prepared statments或正確地逃脫你的變量(將涉及您手動逃避每個變量前提交)。我建議使用預先準備的語句,因爲它們更容易使用。請閱讀這篇文章How can I prevent SQL injection in PHP?。您可以讓那些mysqli OR PDO,PDO的一個很好的例子準備statments,從計算器

$id = 1; 
$stm = $pdo->prepare("SELECT name FROM table WHERE id=?"); 
$stm->execute(array($id)); 
$name = $stm->fetchColumn(); 

令牌,您可以瞭解more here約PDO預處理語句。我也希望你在這裏How can prepared statements protect from SQL injection attacks?

+0

那麼,你不需要*準備語句,以避免SQL注入;正確逃脫也非常好。 – deceze

+0

@deceze你呢。準備好的聲明使格式正確,完整和強制性。而手動格式化不會# –

+0

@您可以避免SQL注入*,而無需預先準備好語句。沒有人認爲準備好的聲明使它更容易*,但它們不是唯一的解決方案!不要傳播不必要的FUD。 – deceze

-1

不,PDO::querymysql_query或任何其他原始查詢方法一樣脆弱。

如果你

$sql = "SELECT foo FROM bar WHERE baz = '$var'"; 

$var

Robert'; DROP TABLE users; -- 

所以結果是

SELECT foo FROM bar WHERE baz = 'Robert'; DROP TABLE users; --' 

然後沒有 API可以幫助你,因爲沒有API可以告訴區別什麼qu部分以及用戶值是什麼。這種差異只有在API使用準備好的語句轉義爲正確的值中的特殊字符時纔會清楚。

閱讀The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

0

一臉查詢功能是不是安全。

您最好使用準備的PDO對象。

例如

$sth = $dbh->prepare("select * from mytable where myattr = :attr"); 

$ sth處理程序可用於設置查詢中的佔位符(例如,:ATTR在這個例子中)

你有兩個選擇:

或者直接在該處理程序的執行函數使用數組:

$sth->execute (array ('attr', $myattr)); 

bindParam處理程序的功能,然後執行

$sth->bindParam ('attr', $myattr); 
$sth->execute(); 

的方法提供你的論點逃逸單引號的一個好辦法。

:還採取掠奪在Why you Should be using PHP’s PDO for Database Access (net.tutsplus.com)