1

当您对注册用户进行身份验证时,您会提出请求,例如我发现的一个示例:

$user = $_POST['user'];
$pw = $_POST['password'];

$sql = "SELECT user,password FROM users 
    WHERE user='$user' 
    AND password='$pw' 
    LIMIT 1";
$result = mysql_query($sql);

if (mysql_num_rows($result)){
    //we have a match!
}else{
    //no match
}

现在最终有什么好处或任何意义LIMIT 1?以及为什么只需要选择 user_id 就需要选择用户名和密码?

不会

SELECT user_id FROM users
WHERE user = '{$user}'
AND password = '{$pw}'

相同的物流但更短的代码?

编辑:考虑到这个小细节,我又找到了一项防止黑客的检查。不应有多个用户具有相同的电子邮件和密码,因此如果他们以某种方式提供而不是密码,123例如字符串' OR password = '*'(或类似的逻辑),这将损害我的查询,没有限制会有所帮助,因为下一步我可以数数

if (count($result) > 1) {
   echo "we got hacked";
else 
   <proceed...>
4

5 回答 5

4

假设每个用户名/密码对在数据库中只有一行,LIMIT 子句通过在找到第一个匹配项后停止搜索来提高性能,主要是在与 ORDER BY 子句结合使用时。

MySQL 手册

如果将 LIMIT row_count 与 ORDER BY 一起使用,MySQL 会在找到排序结果的第一个 row_count 行后立即结束排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。

于 2012-04-09T13:29:09.177 回答
1

最有可能的是,您将拥有一个唯一的user列,因此LIMIT 1没有必要 - 无论如何您不会有超过 1 行。

在这种情况下,它可能是一个装饰元素——自我解释的语法告诉阅读代码的程序员,该查询预计返回不超过一行。

除了你的问题,我强烈建议使用一些密码加密,例如MD5(). 教您存储纯密码的教程不是最好的...

于 2012-04-09T13:31:23.840 回答
1

您可以阅读“ SQL 注入:如何防止 PHP / MySQL 中的安全漏洞”,看看如果没有适当的措施,您的登录可能会变得毫无用处。

上面更聪明的海报回答了其他所有问题。

于 2012-04-09T13:39:20.323 回答
0

在大多数情况下,您的表将保存唯一的用户名,因此您将始终返回 1 或 0 行。就您的代码而言,它没有任何区别。即使您返回了多行,您的代码仍然可以工作,因为您只检查是否存在行而不是返回了多少行(但这是错误的,因为您不知道实际登录的用户) .

基本上它只是告诉 MySQL 在找到满足 WHERE 条件的第一行之后停止搜索表。在某些情况下,甚至这可能是多余的(例如,如果您在“用户”字段上有一个 UNIQUE 索引)。

与您的问题无关的另一件事:请不要将此代码用于学习之外的任何事情。它充满了安全漏洞。在将此代码投入生产之前,请在 Google 上搜索“SQL 注入”和“安全存储密码”。

于 2012-04-09T13:30:59.837 回答
-1

首先,您需要从注入中清除字符串:

class main{
public function sanitize($str,$remove_nl=true)
        {
            stripslashes($str);

            if($remove_nl)
            {
                $injections = array('/(\n+)/i',
                    '/(\r+)/i',
                    '/(\t+)/i',
                    '/(%0A+)/i',
                    '/(%0D+)/i',
                    '/(%08+)/i',
                    '/(%09+)/i'
                    );
                $str = preg_replace($injections,'',$str);
            }

            return $str;
        }
}

接下来是你的代码:

$main_class = new main();

$user = $main_class->sanitize(trim($_POST['user']));
$pw = $main_class->sanitize(trim($_POST['password']));

$sql = "SELECT * FROM `users` WHERE `user`='".$user."' AND `password`='".$pw."' LIMIT 0,1";
$result = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($result);

if($count > 0){
    //we have a match!
}else{
    //no match
}
于 2012-04-09T13:34:40.927 回答