首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >md5是否停止SQL注入?

md5是否停止SQL注入?
EN

Stack Overflow用户
提问于 2016-01-26 22:26:25
回答 3查看 4.6K关注 0票数 1

好的,

所以,我有点不确定。

我有一个url参数用户名

我有一份声明

代码语言:javascript
复制
SELECT * FROM users WHERE user_hash = md5($_GET['username'])

这安全吗?

在创建帐户时,将存储用户名和密码的md5散列版本。

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

EN

回答 3

Stack Overflow用户

发布于 2016-01-26 22:40:00

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

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

代码语言:javascript
复制
$sql = "UPDATE users SET fullname = '" . md5($_GET['fullname']) . "'
        WHERE id = '" . md5($_GET['id']) . "'";

但是MD5是单向散列,因此不可能以这种方式显示全名。

票数 5
EN

Stack Overflow用户

发布于 2016-01-26 22:42:47

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

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

代码语言:javascript
复制
?username=%27a%27);DROP%20TABLE%20users;%20--

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

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2016-01-26 22:42:12

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

原因是,像搜索具有特定名称的用户这样的简单操作是不可能的。

代码语言:javascript
复制
SELECT * FROM users where user LIKE '%cat%'

会发现里面有cat这个词的所有用户。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35025244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档