[英]what's the difference between these three sql queries?
这三个查询在安全性和良好的编码语法方面有什么区别?
$sql = "SELECT user_id,
user_email,
user_pass
FROM user_tb
WHERE user_email =\"".$e."\"
AND user_pass = md5(\"".$p."\") ";
$sql = "SELECT user_id,
user_email,
user_pass
FROM user_tb
WHERE user_email = '$e'
AND user_pass = '$p' ";
$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.