首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$mysqli->real_escape_string用于控制接受用户输入的select查询的安全性

$mysqli->real_escape_string用于控制接受用户输入的select查询的安全性
EN

Stack Overflow用户
提问于 2014-04-25 12:14:38
回答 4查看 854关注 0票数 0

我的PHP应用程序有一个查询,它将md5哈希作为输入,通过GET方法从用户处输入,然后将$mysqli->real_escape_string()应用于它。之后,它运行SELECT语句。

这个功能有多安全?SQL注入它或者XSS它是可能的?

EN

Stack Overflow用户

发布于 2014-04-28 21:40:42

TL;DR 不,它并不总是安全的。

安全使用需要您的…

  1. …仅用于转义SQL 字符串文字.。 如果将不受信任的数据用于任何其他SQL令牌,则必须以其他方式防止SQL注入。一些琐碎的例子:
代码语言:javascript
运行
复制
- attempting to use for escaping some other literal, e.g. an integer:

使用/script.php?id=0+OR+1 $id =$mysqli->/script.php?id=0+OR+1_$id_string($_GET‘’id‘);$mysqli->查询(“SELECT* FROM users WHERE id = $id")这将提交:

users中选择*,其中id =0或1

-尝试用于转义对象标识符,例如列名: as /script.php?col=id%60+%3d+0+OR+1+-+ $col =$mysqli->GET_ WHERE _string($_GET‘col’);$mysqli->查询(“SELECT* FROM users $col = 123")这将提交:

users中选择*,其中id =0或1 --‘= 123

-尝试用于转义SQL: as /script.php?orderby=OR+1 $orderby =$mysqli->real_ id _string($_GET‘$orderby’);$mysqli->查询(“SELECT* WHERE id=0 $orderby")这将提交:

users中选择*,其中id =0或1

  1. …正确地引用那些转义字符串文字. 有两种可能的方法来做到这一点。以下任一项:
代码语言:javascript
运行
复制
- quote the escaped string literal with single-quote `'` characters; or
- _explicitly_ set an [SQL mode](http://dev.mysql.com/doc/en/sql-mode.html) that includes neither [`ANSI_QUOTES`](http://dev.mysql.com/doc/en/sql-mode.html#sqlmode_ansi_quotes) nor [`NO_BACKSLASH_ESCAPES`](http://dev.mysql.com/doc/en/sql-mode.html#sqlmode_no_backslash_escapes) _and then_ quote the escaped string literal with double-quote `"` characters.

如果没有完全执行这两个步骤中的一个,则仍然容易受到SQL注入的影响。例如,如果服务器默认设置NO_BACKSLASH_ESCAPES,并且没有显式地从该模式更改:

使用as /script.php?name=%22+OR+1+-+ $name =$mysqli->real_GET_string($_GET‘name’);$mysqli->查询(‘SELECT* FROM users name =’.$name.‘’);

这将提交

users选择* name = "“或1-”

  1. …只在第一次设置数据库连接的编码. 之后才使用 必须在连接的客户端和服务器端使用相同的编码:确保这一点的最佳方法是调用mysqli::set_charset()。使用其他方法可能会使您容易受到编码攻击:使用as /script.php?name=%bf%27+OR+1+-+ $name =$mysqli--+ name _string($_GET‘name’);$mysqli->查询(“SET name 'gbk'");// SET仅在服务器上,而不是在客户端$mysqli->查询上(”name=‘$name’“);这将提交 从users选择* name = '縗‘或1-’
  2. …不要使用 易受伤害 版本的库. 在该错误修复之前(在MySQL版本4.1.20、5.0.22、5.1.11中),即使正确设置了连接字符编码,libmysqlclient也容易受到上述编码漏洞的攻击。
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23292861

复制
相关文章

相似问题

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