2011-12-26 40 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

相关问题