【问题标题】:MYSQL Injection and md5 encryptionMYSQL 注入和 md5 加密
【发布时间】:2011-08-12 15:13:38
【问题描述】:

如果我用 md5 加密一个 MYSQL 注入,它还会执行吗?如果我在执行“mysql_real_escape_string”之前加密 MYSQL 注入,它是否能够使 mysql 注入为空?我应该在加密之前运行“mysql_real_escape_string”吗?

【问题讨论】:

  • 加密注入是什么意思?你有例子吗?
  • 应该提到您正在明确地查看 PHP 解决方案,作为标签或在问题主体本身中。

标签: php mysql encryption md5 code-injection


【解决方案1】:

md5() function 返回一个包含 ASCII 字符 0-9 和 a-f 的字符串。 SQL 注入需要使用 '" 之类的字符,因此考虑到算法按预期工作,由 md5() 生成的哈希字符串永远不会导致 SQL 注入。

因此,您可以放心地编写这样的内容:

$username = mysql_real_escape_string( $_POST['username'] );
$password = md5( $_POST['password'] );
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'");

但最好始终使用 mysql_real_escape_string() 转义传递给查询的数据。

【讨论】:

  • 请参阅我通常使用“sprintf()”然后 mysql_real_escape_string 作为查询的第二个参数来执行此操作。不知道我是否可以逃脱 md5 加密,但如果他们在编码时不能恶意使用它,我似乎不需要担心它
  • 一个“好的做法”是转义所有不受信任的 teztual 数据。 MD5返回值得信赖。不加区别地转义所有数据会导致两个问题:1. 转义并不总是清理数据的方法(想想数字) 2. 不常见,但实际上您可能会遇到“双重转义”问题。
  • @Mchl:所有数据是不受信任的,因为它是由最不受信任的实体 - 程序员处理的。这就是为什么最好对传递给 SQL 查询的所有数据进行转义。
  • 太棒了。我当然不会相信这样想的程序员。那么逃跑对这里有什么帮助呢? $sql = "SELECT * FROM users WHERE ID = $ID"; 转义对已经转义的数据有何帮助?
  • 你当然不会。正如我所写 - 程序员是唯一犯错误的人。这就是为什么最好使用一种方法来构建 SQL 查询,该方法可能使用 vprintf(),作为通用解决方案。制定编码约定将有助于减少您编写的问题。
【解决方案2】:

如果您使用 MD5 散列了一个值,则它不再包含任何可恶意注入的字符。 MySQL 不会解码 MD5 哈希并将其解释/执行为 SQL。事实上,MD5 哈希是无法解码的,因为它是一种单向算法。

【讨论】:

  • 或者说它是这样设计的,但它没有预期的那么强大。
【解决方案3】:

MD5 散列值是二进制数据,在 php 中以十六进制表示。这意味着,它们只包含数字 0..9 和字母 A..F。 使用此字母无法进行 SQL 注入,因此您很安全。

【讨论】:

    【解决方案4】:

    MD5 散列值本身不会导致 SQL 注入,但如果您试图避免 SQL 注入,您的方法是导致一个非常好的方法。

    你特例一类不能导致注入的变量(MD5'd密码),然后你特例另一类(例如,评估为整数的东西),然后你忘记了哪些应该被转义,哪些不是,你结束了加上一个很小的微不足道的变量,应该转义但没有转义,并且您的团队中没有人发现它....哎呀,您的代码中存在真正的漏洞。

    你避免转义一个安全类,你避免转义第二个安全类,然后你错误地假设第三个类也是安全的——结果证明,MD5 是二进制编码的,有人设法找到了一种方法用它创建一个注入...糟糕...您的代码中还有一个真正的漏洞。

    你应该:

    1) 始终使用参数化查询。这使得逃避变得不必要,并避免了忘记逃避某些东西的风险。使用mysqlibind_param

    $stmt = $db->prepare('insert into users (username, password) values (?, ?)'); 
    $stmt->bind_param('ss', $name, md5($password));
    $stmt->execute(); 
    

    2)如果由于某种原因你不能,逃避一切。即使这是不必要的。你不想忘记什么。

    对抗 SQL 注入的规则是:不要试图了解什么是安全的,什么不是,假设一切都不安全,并将一切视为不安全。如果您将安全值视为不安全,程序仍然可以正常运行,如果您将不安全值视为安全,您的程序将包含一个巨大的安全漏洞,一个错误就足够了。

    【讨论】:

      【解决方案5】:

      虽然通常 md5 散列值不能用于注入攻击,但值得指出的是,原始 md5 散列值可以被利用。原始 md5 哈希是使用生成的哈希 md5($userSubmittedValue, true) -- 它们很容易受到攻击,因为输出是一个可以包含非十六进制输出的字符串。虽然以原始形式生成散列并不常见,但重要的是要注意技术上的散列值可以在注入攻击中被利用。

      这是一个如何完成的示例:

      http://cvk.posterous.com/sql-injection-with-raw-md5-hashes

      正如其他人指出的那样,十六进制 md5 输出不容易受到注入攻击。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-18
        • 2016-03-14
        • 2021-04-10
        • 2011-08-09
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多