好的,
所以,我有点不确定。
我有一个url参数用户名。
我有一份声明
SELECT * FROM users WHERE user_hash = md5($_GET['username'])这安全吗?
在创建帐户时,将存储用户名和密码的md5散列版本。
我很困惑,因为这看起来很简单,如果md5停止了sql注入,为什么用户名和密码不总是以散列形式保存呢?
发布于 2016-01-26 22:40:00
是的,这将避免SQL注入,因为md5()总是返回一串十六进制代码。
但它不是SQL注入的通用解决方案。您必须以MD5格式对表中的几乎所有数据进行编码。例如,
$sql = "UPDATE users SET fullname = '" . md5($_GET['fullname']) . "'
WHERE id = '" . md5($_GET['id']) . "'";但是MD5是单向散列,因此不可能以这种方式显示全名。
发布于 2016-01-26 22:42:47
简短的回答是否定的,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变量。
发布于 2016-01-26 22:42:12
我很困惑,因为这看起来很简单,如果md5停止了sql注入,为什么用户名和密码不总是以散列形式保存呢?
原因是,像搜索具有特定名称的用户这样的简单操作是不可能的。
SELECT * FROM users where user LIKE '%cat%'会发现里面有cat这个词的所有用户。
此外,简单的管理是不可能的,您甚至不能查看所有用户的名册。
https://stackoverflow.com/questions/35025244
复制相似问题