2013-05-08 83 views
0

這裏是我目前要做的事:如何在PHP SQL查詢中自動轉義字符串?

$db->query(sprintf('INSERT INTO pages (title, content) VALUES ("%s", "%s")', 
    $db->esc($title), 
    $db->esc($content)));

正如你可以看到我手動每個字符串傳遞給我的$ DB-> ESC()方法逃避在上面的查詢每個字符串。

首先讓我指出我不想使用預準備語句。

我可以想出最好的辦法是讓我的$ DB-> query()方法包裝的sprintf()並自動調用$ DB-> ESC()對每個字符串轉換規範 - 這樣的:

$db->query('INSERT INTO pages (title, content) VALUES ("%s", "%s")', 
    $title, 
    $content);

對我來說這看起來不錯,但現在我的問題是如何正確解析出格式字符串中的所有字符串轉換規範,並在每個相應參數上調用$ db-> esc()(在將所有參數傳遞給sprintf ())?

你會以不同的方式去做嗎?

+0

你不能只是逃避**所有* *輸入參數?我認爲這不會破壞符合數據(如數字值等)。 – Lukas 2013-05-08 05:07:37

+1

你不想使用預備聲明的任何原因? – Passerby 2013-05-08 05:12:17

回答

2

您應該閱讀約prepared statement

準備:語句模板由應用程序創建併發送到數據庫管理系統(DBMS)。某些值未指定,所謂的參數,佔位符或綁定變量(標記爲下面的「?」):

`INSERT INTO PRODUCT (name, price) VALUES (?, ?)` 

的DBMS分析,編譯和執行的報表模板查詢優化和存儲結果不執行它。 執行:稍後,應用程序爲參數提供(或綁定)值,並且DBMS執行語句(可能返回結果)。

而且它的執行力度在PHP中:PDOMySQLiPostgreSQL等。所以,沒有理由自己去實現它。只要使用它。

1

首先讓我表明您使用準備好的語句。
非常自動的「轉義」(儘管它有被稱爲格式化)你說的,到底是什麼準備語句是。
準備好的語句不一定必須基於數據庫支持的本地準備語句。預備語句的一般思想是用佔位符表示某個查詢部分,並在用佔位數據替換佔位符時應用一些格式。因此 - 您的方法已使用佔位符AKA準備好的語句。

但也有你錯過

  • 一些重要的事情無所謂「逃逸」可以做什麼正確的格式必須代替應用
  • 適當的字符串格式化或者需要引用逃逸,因此你準備語句的處理程序應該同時適用。
  • 還有不止一個不同的SQL文字,每個要求不同格式。因此,爲了滿足現實生活的要求,你不能依靠單一的esc()功能

所以,在這裏你去 - the code for such a wrapper you're asking for,這確實正確格式,因此你將有你的查詢不低於安全比PDO。儘管有PDO所具有的所有限制。

所以,如果你要正確地格式化一切,可能會被添加到查詢,則需要另一種包裝,更復雜的一個:safeMysql