md5是否会停止SQL注入

时间:2016-01-26 22:26:25

标签: php md5 sql-injection

好的,

所以,我对此不太了解。

我有一个网址参数用户名

我有这个陈述

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

这安全吗?

创建帐户后,将存储md5哈希版本的用户名和密码。

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

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

在这种情况下的原因是您的查询字符串参数允许直接访问sql。例如。如果用户发送给您:

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

伪造MD5功能并删除用户表。当然,为了做到这一点,他们必须了解有关数据库的一些事情。处理它的正确方法是MD5进入SQL之前的值。在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变量。

答案 2 :(得分:0)

  

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

原因是因为搜索具有特定名称的用户等简单操作是不可能的。

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

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

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