我正在尝试执行以下语句:
$statement = $database->prepare("SELECT userID FROM user_sessions WHERE sessionID = ?");
$statement->execute(array($sessionID));
但是,它们无法返回userID($ statement-&gt; rowCount()返回0)。如果我修改这样的语句,它可以工作,但是容易受到SQL注入的攻击。</ p>
$statement = $database->prepare("SELECT userID FROM user_sessions WHERE sessionID = '$sessionID'");
$statement->execute();
sessionID是从PHP password_hash()函数生成的哈希,通过PHP $ _GET获得。
为什么前两个陈述不起作用,我该如何纠正它们?
更新: 这是我到目前为止所发现的:
print_r($ sessionID)输出
$2y$10$YW2.87KPO2FqFxZD9jjH7ulmPXR2Mdy7Q2c\/RXjSJjH2yt.Q37aQS
var_export($ sessionID)输出
'$2y$10$YW2.87KPO2FqFxZD9jjH7ulmPXR2Mdy7Q2c\\/RXjSJjH2yt.Q37aQS'
原始的$ sessionID(数据库中的值)是
$2y$10$YW2.87KPO2FqFxZD9jjH7ulmPXR2Mdy7Q2c/RXjSJjH2yt.Q37aQS
答案 0 :(得分:2)
我已经解决了这个问题。我用来对我的sessionID进行URL编码的函数在任何正斜杠之前自动添加了一个反斜杠。因此,参数化PDO语句失败。不知何故,非参数化语句处理反斜杠(因此它只转义正斜杠的含义),sessionID现在变得与原始sessionID相同。