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

时间:2011-05-04 04:49:49

标签: php mysql sql

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

查询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 ";

4 个答案:

答案 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字符串并确保它没有像+ / *这样的错误字符 - “”等