- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我在向我的 friend 解释参数化及其优势,他问我在安全性方面它比 mysqli_escape_string
有什么好处。具体来说,您能想到尽管输入字符串被转义(使用 mysqli_escape_string)仍会成功的任何 SQL 注入(inject)示例吗?
更新:
对于我最初的问题不够清楚,我深表歉意。这里提出的一般问题是,尽管转义了输入字符串,是否可能进行 SQL 注入(inject)?
最佳答案
问题经过编辑(在我的回答发布后)专门针对 mysqli_escape_string
,它是 mysql_real_escape_string
的别名,因此考虑了连接编码。这使得原始答案不再适用,但为了完整起见,我将其保留。
简而言之,新答案:mysqli_escape_string
在安全方面与参数化查询一样好,前提是您不要搬起石头砸自己的脚。
具体来说,PHP doc page 上的巨大警告中突出显示了您不能做的事情。 :
The character set must be set either at the server level, or with the API function
mysqli_set_charset()
for it to affectmysqli_real_escape_string()
.
如果您不注意此警告(即,如果您使用直接的 SET NAMES
查询更改字符集)并且您将字符集从单个 -字节编码转换为“方便的”(从攻击者的角度来看)多字节编码,您实际上模拟了愚蠢的 mysql_escape_string
所做的事情:在不知道输入采用哪种编码的情况下尝试转义字符。
如以下原始答案所述,这种情况使您可能容易受到 SQL 注入(inject)攻击。
重要说明:我记得在某处读到最近的 MySql 版本已经在其末端(在客户端库中)堵上了这个漏洞,这意味着您可能是完美的即使使用 SET NAMES
切换到易受攻击的多字节编码也是安全的。但请不要相信我的话。
与 mysql_real_escape_string
相比,裸 mysql_escape_string
不考虑 connection encoding .这意味着它假定输入采用单字节编码,而实际上它可以合法地采用多字节编码。
一些多字节编码具有对应于单个字符的字节序列,其中一个字节是单引号的 ASCII 值 (0x27
);如果输入这样的字符串,mysql_escape_string
将愉快地“转义引号”,这意味着将 0x27
替换为 0x5c
0x27
.根据编码规则,这可能导致将多字节字符突变为包含 0x5c
的另一个字符,并将“剩余的”0x27
作为独立的单个字符在输入中引用。瞧,您已将未转义的引号注入(inject)到 SQL 中。
有关详细信息,请参阅 this blog post .
关于php - mysql_escape_string 漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026469/
本文实例讲述了mysql_escape_string()函数用法。分享给大家供大家参考,具体如下: 使用 mysql_escape_string() 对查询中有疑问的数据进行编码: 有一些数据例
如果我在 MySQL 5.3 中使用准备好的语句,是否还需要使用 mysql_escape_string 来避免 SQL 注入(inject)攻击? 最佳答案 PDO 应该为您处理转义/ saniti
mysql_escape_string() 有什么作用?我正在更新数据库。当我使用 $_POST('variable')它没有得到更新,但是将它与 mysql_escape_string($_POST
最近我在向我的 friend 解释参数化及其优势,他问我在安全性方面它比 mysqli_escape_string 有什么好处。具体来说,您能想到尽管输入字符串被转义(使用 mysqli_escape
http://php.net/manual/en/function.mysql-escape-string.php 这是为什么? 最佳答案 仔细看看文档,它说了以下内容: This function
我想知道是否可以只使用 my_sql_escape 字符串整个 $_POST 和 $_GET 数组,这样你就不会错过任何变量? 不确定如何测试它,否则我会自己测试。谢谢! 最佳答案 我会使用 arra
我想知道是否可以只使用 my_sql_escape 字符串整个 $_POST 和 $_GET 数组,这样你就不会错过任何变量? 不确定如何测试它,否则我会自己测试。谢谢! 最佳答案 我会使用 arra
真的只是一个快速查询,在我的 PHP 文件中,我有来 self 的 HTML 表单的变量,如下所示: $companyName = mysql_escape_string($_POST['compNa
我知道 mysql_escape_string 已从 5.3 中弃用,但 mysql_real_escape_string 的实际区别是什么。 我认为 mysql_real_escape_string
我知道 mysql_escape_string 已从 5.3 中弃用,但 mysql_real_escape_string 的实际区别是什么。 我认为 mysql_real_escape_string
我在使用 stripslashes 时遇到问题。我无法将我的 Javascript 代码获取到 json_decode,因为我认为斜线是侵入性的。 这是我所拥有的: $str = stri
我有一个文本区域,可以在其中输入文本和图像网址。 文本格式如下: my best friend's email is ............ etc
我有一堆没有正确清理的代码。最好的办法就是绑定(bind)变量,这个页面http://php.net/manual/en/function.mysql-escape-string.php说 mysql
众所周知,我们不能在 Yii 等框架中使用原始 MySQL 查询。我想在我在 Yii 框架中运行的项目中使用 mysql_escape_string 来避免用户输入中的 SQL 注入(inject)。
我在服务器上运行的 codeigniter 中运行一个网络应用程序。这里我有一个用户注册表单,它在本地主机上运行良好。但是当涉及到服务器时,当我尝试注册用户时,我的页面显示错误: mysql_esca
mysql_real_rescape_string() 是否足以保护我免受黑客和 SQL 攻击?问是因为我听说这些对所有攻击媒介都没有帮助吗?寻求专家的建议。 编辑:另外,LIKE SQL 攻击呢?
我正在使用 http://www.elated.com/articles/cms-in-an-afternoon-php-mysql/ 学习 PHP到目前为止,这非常有用,但我无法去替换已弃用的 my
我的问题不是关于需要代码方面的帮助,而是我只是想知道 mysql_escape_string() 是否使 SQL 注入(inject)变得不可能。 我看到很多人使用这个函数来保证 sql 安全。如果我
我已经进行了一些谷歌搜索,但仍然对当我将数据插入 php 表单以添加数据库时如何处理撇号感到困惑。目前,我输入的所有内容都没有撇号,然后通过 phpmyadmin 手动进入,在应该的地方添加撇号,这很
Fatal error: Uncaught Error: Call to undefined function mysql_escape_string() in C:\xampp\htdocs\pho
我是一名优秀的程序员,十分优秀!