繁体   English   中英

这个SQL查询有什么问题?

[英]what's wrong with this sql query?

好的,我在PHP中有两个变量

$username;
$password;

它被初始化为从$ _POST变量中检索的数据:)

我有这个SQL查询

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')";

但这不起作用,并没有给我任何回报:(

你能指导我走向正确的方向吗? 请?

查询在结尾处有一个右括号,没有任何理由,它将无法工作。

它出什么问题了?

不幸的是,一切。 特别是它对SQL注入攻击持开放态度。

如果这是一个逐字剪切和粘贴,那么它实际上不工作的原因是一个尾随的结束括号。 大概你在打电话时没有检查错误?

使用基础MySQL API应该是:

$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?");
$sth->execute($username, $password);
list($count) = $sth->fetchrow();
$authorized = ($count > 0);

或类似的(代码未经测试,E&OE等...)

eeek! sql注入一个!

编辑: 你最喜欢的“程序员”卡通是什么?

在查询结束时为什么会有流浪? 它应该不存在。

哦,并且在SQL注入方面很谨慎。 坏。

您的查询字符串末尾似乎有一个多余的右括号。

[编辑] - 对于那些尖叫的SQL注入攻击:在查询中使用它们之前,我们不知道用户对其变量做了什么。 怀疑的好处怎么样? ;-)

首先, 永远不要这样做。 请阅读有关SQL注入的内容 ,除非您理解了它的内容,否则不要编写任何SQL。 对不起,但这非常重要。

也就是说,您的查询包含一个结束括号。 这看起来像语法错误。 执行它会出错吗?

查询的右侧有一个额外的括号。

此外,如果您没有正确清理代码,那么您将容易受到SQL注入攻击。 你应该使用参数化查询,但至少在$username$password上使用mysql_real_escape_string()代替。

此外,作为一些鬼调试,你的密码很可能是数据库中的MD5哈希值,因为你永远不应该以纯文本形式存储它们。

尝试:

$username = mysql_real_escape_string($_POST["username"]);
$password = md5($_POST["password"]);

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

除了提到的所有其他问题。 Users表中的密码以加密方式存储。 除非您通过MySQL密码加密器运行密码,否则您将永远不会看到此查询中的任何数据,因为密码不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM