亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PDO準備好的語句是否足以阻止SQL注入?

PDO準備好的語句是否足以阻止SQL注入?

呼啦一陣風 2019-05-24 16:02:41
PDO準備好的語句是否足以阻止SQL注入?假設我有這樣的代碼:$dbh = new PDO("blahblah");$stmt = $dbh->prepare('SELECT * FROM users where username = :username');$stmt->execute( array(':username' => $_REQUEST['username']) );PDO文件說:準備語句的參數不需要引用; 司機為你處理。這真的是我需要做的就是避免SQL注入嗎?這真的很容易嗎?如果它有所作為,你可以假設MySQL。另外,我真的只是對使用針對SQL注入的預處理語句感到好奇。在這種情況下,我不關心XSS或其他可能的漏洞。
查看完整描述

3 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

不,他們并不總是。


這取決于您是否允許將用戶輸入放在查詢本身中。例如:


$dbh = new PDO("blahblah");


$tableToUse = $_GET['userTable'];


$stmt = $dbh->prepare('SELECT * FROM ' . $tableToUse . ' where username = :username');

$stmt->execute( array(':username' => $_REQUEST['username']) );

將容易受到SQL注入的攻擊,并且在此示例中使用預準備語句將不起作用,因為用戶輸入用作標識符,而不是數據。這里正確的答案是使用某種過濾/驗證,如:


$dbh = new PDO("blahblah");


$tableToUse = $_GET['userTable'];

$allowedTables = array('users','admins','moderators');

if (!in_array($tableToUse,$allowedTables))    

 $tableToUse = 'users';


$stmt = $dbh->prepare('SELECT * FROM ' . $tableToUse . ' where username = :username');

$stmt->execute( array(':username' => $_REQUEST['username']) );

注意:您不能使用PDO綁定超出DDL(數據定義語言)的數據,即這不起作用:


$stmt = $dbh->prepare('SELECT * FROM foo ORDER BY :userSuppliedData');

以上不起作用的原因是因為DESC而ASC不是數據。PDO只能逃避數據。其次,你甚至不能'在它周圍加上引號。允許用戶選擇排序的唯一方法是手動過濾并檢查它是否為DESC或ASC。


查看完整回答
反對 回復 2019-05-24
  • 3 回答
  • 0 關注
  • 585 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號