2012-12-27 87 views
0

我已經看過許多遍了 - 只是想澄清(我覺得我很困惑)預處理語句和逃避

我轉向今天的mysqli,並使用預處理語句開始。我事先準備好的聲明

function read($table, $var) { 
    if($stmt = mysqli_prepare($link, "SELECT * FROM ? WHERE `uid`=?")) { 
     mysqli_stmt_bind_param($stmt, "si", $table, $var); 
     mysqli_stmt_execute($stmt); 
     return mysqli_fetch_assoc($stmt); 
    } else { 
     echo '<script type="text/javascript>">alert("Something went wrong");</script>'; 
    } 
} 

$info = read("users", $_SESSION['uid']); 
$char = read("characters", $_SESSION['uid']); 

我還需要逃避任何東西

實例?我知道,我知道,我已經在任何地方閱讀過,當使用準備好的陳述時,你不需要逃避,但是有如thisthis這樣的問題讓我很擔心。

回答

4

您查詢的唯一問題是您無法將tableName作爲參數傳遞。 只能將參數值設爲。所以另一種方法是連接tableName和查詢。

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?" 
+1

是否需要注射? – Wulf

+2

如果** downvoter **可以解釋如何'tableName'可以被參數化,我會刪除這個答案。 –

+1

請參閱[可以PHP PDO語句接受表名作爲參數?](http://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-name-as-parameter)和[哪些標記可以在PDO準備語句中參數化?](http://stackoverflow.com/questions/1622521/which-tokens-can-be-parameterized-in-pdo-prepared-statements) –

-1

那麼,首先所有代碼是行不通的。

因此,有2個問題實際上

  1. 我需要做任何額外逃逸的綁定參數

  • 如何安全地將標識符插入到查詢中?
  • 這取決於。只要你的表名在你的代碼中被硬編碼 - 可以按原樣插入它。
    但是,如果它來自不受信任的來源,則必須使用白名單將其過濾出來。 我在其他答案中解釋過https://stackoverflow.com/a/8255054/285587

    至於你連接的問題,第二個問題是無關緊要的,第一個問題沒有意義。 LIKE是假設返回很多行,所以,必須根本不使用LIKE或不擔心它(就安全性而言)。雖然在返回正確的結果方面,你可能想要轉義在LIKE中有特殊意義的字符,但是我根本不會使用LIKE來進行搜索。

    +0

    爲什麼它不工作? – Wulf

    +0

    我不明白你的最後一段...什麼是「喜歡」?你是指我發佈的問題嗎? – Wulf