【问题标题】:Does md5 stop SQL Injectionmd5 是否停止 SQL 注入
【发布时间】:2016-01-26 22:26:25
【问题描述】:

好的,

所以,我对此有点不确定。

我有一个url参数用户名

我有这个声明

SELECT * FROM users WHERE user_hash = md5($_GET['username'])

这样安全吗?

在创建帐户时,会存储用户名和密码的 md5 哈希版本。

我很困惑,因为这看起来很简单,如果 md5 停止 sql 注入,为什么用户名和密码不总是以哈希形式保存?

【问题讨论】:

标签: php md5 sql-injection


【解决方案1】:

我很困惑,因为这看起来很简单,如果 md5 停止 sql 注入,为什么用户名和密码不总是以哈希形式保存?

原因是不可能进行简单的操作,例如搜索具有特定名称的用户。

SELECT * FROM users where user LIKE '%cat%'

将找到其中包含单词 cat 的所有用户。

简单的管理也是不可能的,您甚至无法查看所有用户的名册。

【讨论】:

    【解决方案2】:

    是的,这将避免 SQL 注入,因为md5() 总是返回一串十六进制代码。

    但这不是 SQL 注入的通用解决方案。您必须以 MD5 格式对表中的几乎所有数据进行编码。例如,

    $sql = "UPDATE users SET fullname = '" . md5($_GET['fullname']) . "'
            WHERE id = '" . md5($_GET['id']) . "'";
    

    但 MD5 是一种单向哈希,因此无法显示以这种方式存储的全名。

    【讨论】:

    • @Gumbo 已修复,在 MD5 ID 周围添加了引号。
    【解决方案3】:

    简短的回答是否定的,MD5 不会阻止 SQL 注入。正确的编码是处理这个问题的最好方法。

    出现这种情况的原因是您的查询字符串参数允许直接访问 sql。例如。如果用户发给你怎么办:

    ?username=%27a%27);DROP%20TABLE%20users;%20--
    

    这会伪造 MD5 函数并删除 users 表。当然,他们必须了解您的数据库才能做到这一点。处理它的正确方法是在它进入 SQL 之前对值进行 MD5。在 PHP 中会是这样的:

    $username = $GET['username'];
    $hashed_username = md5($username);
    $sql = "SELECT * FROM users WHERE user_hash = '$hashed_username'"
    

    或者最好的解决方案是在查询中使用绑定变量,让 SQL 库处理翻译。如果您使用的是 PHP,请查看 PDO bindParam,http://php.net/manual/en/pdostatement.bindparam.php

    顺便说一句,您的 SQL 将不起作用,因为您需要在 SQL 中引用 (') get 变量。

    【讨论】:

    • 是的,这只是这篇文章的快速输入。不是我的实际代码。此外,在下面发帖的人证实了我对 md5 的看法,但与你所说的相矛盾.. 嗯。这对初学者来说很难
    • 我不同意MD5全面阻止SQL注入的说法。在我看来,使用绑定变量是避免 SQL 注入的最简单/最安全/最省力的方法,但当然有一个学习曲线。通常,无论如何,将变量直接放入 SQL 中是个坏主意。
    • 它是如何“伪造”MD5函数的?如果你在 PHP 中调用md5() 在替换到 SQL 之前,;DROP 将被编码成 MD5 字符串。
    • @Barmar 我同意,在替换之前在 PHP 中使用 MD5 是一个可行的解决方案(我的回答类似,你也一样)。如果使用问题描述的MD5语句存在问题,其中MD5函数可以由MySQL执行,这可能导致SQL注入。正如您在回答中所描述的,使用 MD5 转换所有数据是一种解决方案,但正如您所提到的,需要将存储的所有数据更改为 MD5,而 MD5 是单向的。参数绑定查询为 SQL 注入和保持数据可用提供了解决方案。在需要/需要混淆的地方使用 MD5。
    • 不清楚他在问题中是如何使用它的。他的声明不是有效的 PHP 或 MySQL,他没有显示他在哪里引用和连接。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2011-12-27
    • 2021-10-06
    • 1970-01-01
    • 2015-08-12
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多