好的,
所以,我对此不太了解。
我有一个网址参数用户名。
我有这个陈述
SELECT * FROM users WHERE user_hash = md5($_GET['username'])
这安全吗?
创建帐户后,将存储md5哈希版本的用户名和密码。
我很困惑,因为这看起来很简单,如果md5停止sql注入为什么不是用户名和密码总是以哈希形式保存?
答案 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的所有用户。
简单的管理也是不可能的,你甚至无法查看所有用户的名单。