php - mysql_real_escape_string是否容易受到无效 utf 8 开发的影响如过长的utf 8 或者ill的utf 8 序列?

  显示原文与译文双语对照的内容
0 0

假设我将数据库设置为使用 UTF-8 ( 在mysql中使用完整 4mb 版)


mysql_query("SET CHARACTER SET utf8mb4");
mysql_query("SET NAMES utf8mb4");

我用mysql_real_escape_string不必要的字符转义字符串之前到sql( 注意- 我不是在寻找 switch 到PDO的建议,我想确定mysql_real_escape_string是否是安全的,而不是冗长的utf8等) 。


$input = mysql_real_escape_string($_POST['field']);
$sql ="SELECT * FROM `table` WHERE `header`='$input'";

有什么我需要做验证 $_POST['field'] (如。 检查字符串是否有效 UTF-8 和不是太长的,不包含无效序列等)在做mysql_real_escape_string或这是足够的?

时间: 原作者:

0 0

所有的输入验证和anti-SQL注入都受到了 。的误解。 事实上,所有这些都归结为一件事:

确保正确的SQL查询语法

如果你能够为任何输入数据确保正确的SQL语法,那么你是安全的,你无需阅读或者研究任何关于验证或者 SQL注入的内容。 因为所有这些vulnerabilites只在允许不正确的SQL语法的情况下才是可能的。

为了确保在你的案例中正确的SQL查询语法,你必须确保你的$input 在查询正确的路径中被转义。 查看PHP文档: http://php.net/mysql_real_escape_string:

警告安全性:默认字符集

字符集必须在服务器级别设置,或者使用 API function mysql_set_charset() 来影响 mysql_real_escape_string() 。 有关更多信息,请参见字符集的概念部分。

因此,在你的字符集中必须正确地通知 mysql_real_escape_string,以便能够正确转义。 因此,你应该执行以下操作:


mysql_set_charset("utf8mb4");

原作者:
0 0

在我回答之前公布一个公共服务公告。 你仍在使用 mysql_query 。 最后,你至少需要升级到 mysqli,即使你不想使用 go 。 所有 mysql_ 函数都被折旧为( 看到前面链接中的大红色吓人框),并且可能会在 PHP 5.6中删除。 这很重要,因为在你的案例中建议PDO的主要原因是 prepared 语句mysqli 也可以。 prepared 语句比转义更容易被注入,但需要更多的查询( 小性能命中) 来执行。

至于 UTF8,我建议使用 mb_check_encoding,以确保字符串在尝试插入之前至少是有效的UTF8.

最后,这里有这个答案,它提供了这些智慧的单词

使用mysql_real_escape_string进入热水的另一种方法是使用错误的方法设置数据库连接编码。 你应该这样做:

mysql_set_charset ('utf8',$link);

你还可以执行以下操作:

mysql_query ("SET NAMES'utf8'",$link);

问题是后者绕过了 mysql_ API,它仍然认为你正在使用 latin1 ( 或者其他别的东西) 与数据库交谈。 现在使用mysql_real_escape_string时,它将假设错误的字符编码和转义字符串,与数据库后面解释它们不同。 通过运行 SET NAMES 查询,你在mysql_客户端API如何处理字符串和数据库如何解释这些字符串之间创建了一个裂缝。 这可以用于某些多字节字符串情况下的注入攻击。

原作者:
...