【发布时间】:2013-12-10 14:15:19
【问题描述】:
我正在尝试将我的登录脚本从 mysql 更改为 PDO。 对于我的脚本的其余部分,除了这部分之外,所有接缝都很好,我就是不明白为什么。
我有下面的代码
...
$pasword=md5($_POST['password']);
$email=$_POST['email'];
....
$query ="SELECT id FROM guests WHERE email=':eml' AND password =':pwd' AND lead_guest=17";
// $param2=array(':eml'=>$email,':pwd'=>$pasword);
$state=$dbh->prepare($query);
$state->bindParam(':eml',$email);
$state->bindParam(':pwd',$pasword);
$state->execute();
在当前状态下,它将返回 0 的行数(它不应该),我也尝试过
//$state->bindParam(':eml',$email);
//$state->bindParam(':pwd',$pasword);
$state->execute($param2);
它也返回 0 的行数。
变量$email 和$pasword 当我echo 出来时是正确的,并且脚本使用mysql_ 函数完美运行。
$dbh 变量在标头中创建,并带有$query ="select id where 1",它按预期工作。
我确信(尽管可能是错误的)我将问题缩小到脚本的 state->bindParam() 部分。我完全迷失了为什么脚本的这一部分不起作用任何建议热烈欢迎。
【问题讨论】:
-
只用 MD5 散列密码是不够的;使用strong password hashing algorithm。
-
嘿,至少 PHP 准备好的语句的问题开始更频繁地出现在 stackoverflow 上,或者这只是我的印象。
-
@Mihai 我每天都看到 SQL 注入漏洞,甚至每小时。
-
我认为 pdo 应该可以防止 sql 注入?
-
@MarkGilchrist - PDO 帮助您编写防止 SQL 注入的代码;如果有人编写糟糕的 SQL,那么他们使用的库并不重要。你的代码很好 - 是那些使用 PDO 并且仍然直接从 $_POST 直接连接变量的人做错了。
标签: php mysql pdo prepared-statement