2011-01-07 92 views
5

我是新手與PDO庫。我正在使用mysql作爲數據庫開發環境。我可以使用準備和執行功能來運行我的查詢,同時使用「?」佔位符和bindParam方法,同時使用命名佔位符(例如:「:column」)。我們如何知道PDO正在逃避SQL注入?

在此之後,我試着看看是否通過放入任何引號來清理查詢,如mysql_real_escape_string所做的任何類型的轉義。我試圖看看查詢會是​​什麼樣子,但我所得到的是已經傳遞到準備語句中的語句,但不是將執行的查詢。

我試圖var_dump $ result-> execute()和$ result-> fetch(),但執行語句給我準備語句的sql與佔位符,而fetch語句給了我查詢的結果。

有沒有一種方法可以查看將要運行的查詢查詢,或者至少在運行查詢之前查看參數的方式?

我希望我清楚我的問題。 :|

+1

你想太多了。準備好的語句以100%的速度逃避您的輸入。如果您需要查看最終查詢的樣子,則必須設置數據庫查詢日誌。 – netcoder 2011-01-07 16:39:42

+1

@netcoder準備好的語句不會轉義任何東西(除非在兼容模式下)。查詢日誌 – 2011-01-07 16:50:01

+0

@Col中沒有新內容。彈片:技術上來說是的,儘管你可以用你想要的方式說出來。至於「查詢日誌中沒有新內容」,我根本就不明白這是什麼意思...... – netcoder 2011-01-07 16:54:31

回答

6

「後,」當你寫的東西,如:

$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;'); 
$stmt->bindValue('col_name', 'some \' value'); 
$stmt->execute(); 

的實際查詢是... SELECT * FROM tbl_name WHERE col_name = :col_name;。這就是所謂的準備語句。首先,你發送查詢到數據庫,稍後你發送查詢參數。 PDO不合並查詢和參數。

你可能認爲PDOStatement::bindValue()確實是這樣的:

public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) { 
    $this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query); 
} 

它做的東西更像:

public function execute() { 
    try { 
     $this->sendQueryToDatabase($this->query); 

     // Query is valid 
     $this->sendParametersToDatabase($this->parameters); 

     return $this->fetchResultSet(); 
    } catch (... $e) { 
     // Query is invalid (eg. syntax error) 
     throw ...; 
    } 
} 

Read more about Prepared Statements

1

的準備語句是由MySQL處理,所以PDO不要逃避請求, PDO發送請求和參數

-1

啓用一般查詢日誌,看實際被反對,當你運行簡單的報表服務器執行的查詢 - 做一些刀片例如,包含嵌入的引號或nuls的字符串。

3

說得直。

PDO有2種模式運行的準備的語句:

  1. 機模式。查詢和數據被髮送到數據庫se-pa-ra-te-ly。這意味着數據從未被添加到查詢中。所以,不可能造成任何傷害。永遠。正在發送到數據庫的查詢有?標記(但沒有命名的佔位符被PDO替換爲? s)
  2. 兼容模式。 PDO通過用綁定變量替換佔位符取決於變量名稱,可以做出舊式查詢。字符串被引用/逃脫,其餘的被轉換爲它的類型。

這兩種方法都非常安全。

真正的危險開始,當你有一個變量標識符 ...