3 回答

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。
添加回答
舉報