繁体   English   中英

这三个 sql 查询有什么区别?

[英]what's the difference between these three sql queries?

这三个查询在安全性和良好的编码语法方面有什么区别?

查询 1

$sql = "SELECT user_id,
               user_email,
               user_pass
          FROM user_tb 
         WHERE user_email =\"".$e."\" 
           AND user_pass = md5(\"".$p."\") ";

查询 2

$sql = "SELECT user_id,
               user_email,
               user_pass
          FROM user_tb 
         WHERE user_email = '$e' 
           AND user_pass = '$p' ";

查询 3

$sql = "SELECT user_id,
               user_email,
               user_pass
          FROM user_tb 
         WHERE user_email = $e 
           AND user_pass = $p ";

这三个实际上都没有安全性,并且容易受到任何 sql 注入的影响。 您可以在变量周围使用mysql_real_escape_string() ,或使用准备好的语句来确保安全。

话虽如此,在 $e 和 $p 变量周围加上引号只会确保您没有 sql 错误,以防这些值为 null。

它们在我的书中都失败了,除非$e$p都已经在屏幕外进行了清理。 如果是这样,那么#2获胜。 MD5是弱hash。 与 MySQL 相比,PHP 可以使用hash_hmac() sha512 或其他库(每个人都会这么说)执行更强大的散列。 如果您无论如何都使用md5() ,我想 php 将比 MySQL 执行得更快,但这不是安全问题。 除此之外,#1 和#2 并列。

#3 的问题是 $e 或 $p 可能因任何原因为空的情况。 您的查询将是where user_email= AND user_pass ,您将收到令人讨厌的 MySQL 语法错误。 除了可能收到的其他卫生设施外,他们还需要用引号括起来,否则卫生设施对您没有任何好处。

编辑:正如 OMG Ponies 指出的那样,您需要与 md5() (或任何哈希)检查保持一致。 我假设密码 hash 已存储,并且在上面的查询 #2 和 #3 中, $user_pass在用于查询之前由 php 散列。

第一个对变量($e 和 $p)执行字符串连接,另外使用MD5 function获取密码的 hash 以与USER_TB.user_pass列值进行比较。 如果值不存储为 hash,MD5 就没有任何好处 - 因为没有任何东西可以匹配。 反之亦然...

第二个示例缺少 MD5 function 使用,但将变量正确地括在单引号中以被视为字符串文字,以便与列值进行比较。

第三个查询缺少正确的 SQL 字符串处理和 MD5 function 使用的单引号。

概括

这三个都容易受到 SQL 注入攻击。 如果不使用 PDO, sprintf是使用准备好的语句的解决方案:

$query = sprintf("SELECT t.user_id,
                         t.user_email,
                         t.user_pass
                    FROM USER_TB t
                   WHERE t.user_email = '%s' 
                     AND t.user_pass = '%s'",
                  mysql_real_escape_string($e),
                  mysql_real_escape_string($p));

$result = mysql_query($query);

我也喜欢“查询2”。 而且它的安全性为 0,这很容易受到 SQLInjection 的攻击。

您应该清理 $e 和 $p 字符串,并确保它没有像 + /* -- ' " 等坏字符

暂无
暂无

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

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