2016-08-21 97 views
1

我讀這個問題(Should I use bindValue() or execute(array()) to avoid SQL injection?),並發現execute(array())和bindParam()都防止SQL注入處理PDO並準備好陳述。我應該使用bindParam(),bindValue(),或執行()PDO預處理語句

但是我也記得讀書的地方,執行()自動將每一個變量爲一個字符串,如果不管它是一個整數。我的問題肯定是除了字符串變量以外,這是一個安全問題?

例如,如果我是讓在那裏通過一個準備好的查詢等於1的用戶的ID,但是穿過執行參數將被視爲一個字符串不是整數。

顯然,這個腳本不會有任何用戶輸入的方法,並且只支持用戶輸入比如更新個人資料,郵寄等

我學習PDO所以我想充分了解如何編寫安全的PDO查詢(或更好的功能),可以防止/防範SQL注入和其他安全漏洞。

感謝

+0

你可以強制與bindParam參數類型,如果這就是你要找的內容。 http://php.net/manual/en/pdostatement.bindparam.php http://php.net/manual/en/pdo.constants.php – Linesofcode

+0

你也可以做到這一點與PDOStatement對象:: bindValue。 http://php.net/manual/en/pdostatement.bindvalue.php –

回答

1

安全明智的,不存在與發送參數到執行一個單一的問題()。所以,你的擔心是多餘的。鑑於字符串被安全地處理,並且我們將所有的參數作爲字符串發送,我們可以合理地斷定所有參數都是安全處理的(請注意,我不會責怪你的問題,總是要求比抱歉要好,我只是簡單地說) 。

唯一可能的問題與對待所有參數字符串是在數據庫服務器端。然而,大多數數據庫服務器允許在SQL中寬鬆輸入,意味着儘管以字符串形式發送,但任何數據文字都將被正確識別和處理。只有少數邊緣情況下不起作用。下面是關於此事的我的PDO tutorial摘錄:

但是,有時最好是明確設置數據類型。 可能的情況是:在仿真模式,或者只是不能接受一個字符串操作數的任何其他SQL子句

  • LIMIT子句。
  • 與非平凡的查詢計劃複雜的查詢,可以由一個錯誤的操作數類型的影響
  • 特有列類型,像BIGINTBOOLEAN需要確切類型的操作數被束縛(注意,爲了以結合BIGINT 值與PDO :: PARAM_INT你需要一個基於mysqlnd的 安裝)。

作爲結論,給你已經開啓仿真關閉,您可以使用execute()方法,幾乎​​所有的時間。