这三个查询在安全性和良好的编码语法方面有什么区别?
$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 ";
答案 0 :(得分:2)
这三个实际上都没有安全性,并且容易受到任何sql注入。您可以在变量周围使用mysql_real_escape_string(),或使用prepared statements确保安全。
话虽如此,在$ e和$ p变量周围放置引号只会确保在这些值为null时没有sql错误。
答案 1 :(得分:1)
除非$e
和$p
已经在屏幕外进行了清理,否则它们都会在我的书中失败。如果是这种情况,则#2获胜。 MD5是弱哈希。与MySQL相比,PHP可以使用hash_hmac()
sha512或其他库(每个人都会有这样的说法)执行更强大的散列。如果您使用md5()
无论如何,我认为php在这里的执行速度会比MySQL快,但这不是安全问题。除此之外,#1和#2是并列的。
#3的问题是$ e或$ p因任何原因可能为空的情况。您的查询将是where user_email= AND user_pass
,您将收到一个令人讨厌的MySQL语法错误。他们也将需要用引号引用,除了其他卫生,他们可能会收到或卫生是不会做你任何好处。
编辑:正如OMG Ponies指出的那样,你需要与md5()(或任何哈希)检查保持一致。这是我的假设,即密码哈希被存储和查询#2和上述第3项,$user_pass
是由PHP在查询中使用之前散列。
答案 2 :(得分:1)
第一个为变量($ e和$ p)执行字符串连接,另外使用MD5 function来获取密码的哈希值,以便与USER_TB.user_pass
列值进行比较。如果值没有存储为哈希值,则MD5没有任何好处 - 因为没有任何东西可以匹配。反之亦然......
第二个示例缺少MD5函数的使用,但是将变量正确地用单引号括起来作为字符串文字进行处理,以便与列值进行比较。
第三个查询缺少正确的SQL字符串处理的单引号,而MD5函数使用。
这三个都容易受到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);
答案 3 :(得分:0)
我也喜欢“查询2”。 它有0安全性,这很容易受到SQLInjection的影响。
你应该清理$ e和$ p字符串并确保它没有像+ / *这样的错误字符 - “”等