2011-12-26 39 views
4

我使用PHP 5.2.9和Apache 2.2.11和mysql 5.1.32爲什麼不能禁用PDO :: ATTR_EMULATE_PREPARES?

爲什麼我不能禁用PDO :: ATTR_EMULATE_PREPARES?

下面是代碼:

<?php 
try{ 
    $conn = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS, array(PDO::ATTR_EMULATE_PREPARES => false)); 
} 

catch(PDOException $pe){ 
    die('Connection error : ' .$pe->getMessage()); 
} 

$st = $conn->prepare('abc'); 
echo "emulate : " . $st->getAttribute(PDO::ATTR_EMULATE_PREPARES); 
?> 

輸出爲 「模擬:1」。我也試過了代碼:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 

但是輸出仍然是相同的值「1」。如果該值爲假,輸出應爲0?但爲什麼輸出是1?如何禁用ATTR_EMULATE_PREPARES?

回答

3

你的代碼適用於我在PHP 5.3.6和mysqld 5.1.58(它返回false並真正使用準備),嘗試將PHP升級到> = 5.3以查看它是否是版本問題(如果是,則更新是可能你唯一的解決方案)。

即使您設法設置此標誌,它並不意味着PDO將使用準備好的語句,如果您想檢查PDO是否真的使用準備(並且您可以使用wireshark),您可以編寫簡單的腳本做準備查詢:

<?php 
    $pdo = new PDO(..., array(ATTR::PDO_EMULATE_PREPARES => false)); 
    $stmt = $pdo->prepare('SELECT :param'); 
    $stmt->bindValue(':param', 5); 
    $stmt->execute(); 

嗅探傳輸,直到你找到你查詢「SELECT:參數」 - 如果:PARAM用問號代替,那麼PDO使用準備。如果它被替換爲'5',則PDO模擬準備。

+0

如果它被替換爲'5',那麼它表示該語句不使用綁定參數。綁定參數用於防止SQL注入,但現在模擬準備不使用綁定參數,因此它不能防止SQL注入正確?所以我必須設置模擬準備=>錯誤,那麼只有它可以防止SQL注入權? – zac1987 2012-01-04 01:00:05

+0

它可以保護您免受SQL注入攻擊,只要它正確地轉義參數 - 並且它確實如此。 – 2012-01-04 08:20:50

+0

我在我的在線web主機上運行php版本5.2.14進行了測試,能夠禁用仿真準備。所以這不是PHP版本的問題。我猜WAMP服務器脫機本地主機不能禁用模擬? – zac1987 2012-01-04 23:58:06

相關問題