0

使用web漏洞扫描器解析日志后发现这个

level Warning code 1366 message Incorrect string value: '\xDE~\xC7\x1FY\x00...' for column 'act_parametres' at row 1

字符串是“\xDE~\xC7\x1FY\x00”

这是一个片段以显示我的理解

<?php

mysql_connect('localhost', 'root', '');
mysql_select_db('testsunitaires');
mysql_query('SET NAMES utf8mb4');
mysql_query("set collation_connection='utf8mb4_unicode_ci'");
mysql_query("set collation_database='utf8mb4_unicode_ci'");
mysql_query("set collation_server='utf8mb4_unicode_ci'");

mysql_query('CREATE TABLE `encodage` (`chaine` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci');

$s = "\xDE~\xC7\x1FY\x00";
$sql = sprintf("INSERT INTO encodage SET chaine='%s'", mysql_real_escape_string($s));
mysql_query($sql);
echo "$s => " . htmlentities($s, NULL, 'ISO-8859-1') . "\n";
echo "$s => " . htmlentities($s, NULL, 'UTF-8') . "\n";
echo mb_detect_encoding($s, 'auto', true) . "\n";

$req = mysql_query('SHOW WARNINGS');
while($a = mysql_fetch_array($req)) var_dump($a);

它的输出是

�~�Y => &THORN;~&Ccedil;Y
�~�Y => 

array(6) {
["Level"]=> string(7) "Warning"
["Code"]=> string(4) "1366"
["Message"]=> string(73) "Incorrect string value: '\xDE~\xC7\x1FY\x00' for column 'chaine' at row 1"
}   

ISO-8859-1 中的 htmlentities() 运行良好,但在 UTF-8 中却不行(而且我的应用程序是完整的 UTF-8)。mb_detect_encoding() 无法解析字符串。

这个字符串显然是一种攻击方式,但最好的答案是什么?只是丢弃一个编码不好的字符串?有没有办法清理字符串?我的目标是根本没有 Mysql 警告,但不要错过来自配置错误的浏览器的信息,该浏览器试图将 latin1 与 UTF-8 网站“对话”。

4

1 回答 1

2
  1. 不要使用mysql_query('SET NAMES utf8mb4');. 这会通知服务器您将向其发送 UTF-8,但它不会将客户端mysql_扩展设置为使用 UTF-8。这意味着mysql_real_escape_string根据错误的字符集转义数据,可能导致严重的可利用漏洞。

    改为使用mysql_set_charset

  2. 如果一个值不是有效的 UTF-8,那么它不是有效的 UTF-8。您不必担心“浏览器损坏”。实际上没有。*如果您的服务器以未知/损坏的编码从客户端接收数据,您将拒绝它。你不能用它做任何其他事情。检查mb_check_encoding数据是否以您期望的编码进行编码,400 Bad Request如果不是,则抛出错误。另请参阅在 Web 应用程序中从前到后处理 Unicode

  3. mysql_已弃用,请使用 mysqli 或 PDO。

* 某些较旧的 IE 版本在某些情况下倾向于忽略accept-charset表单上的声明。这可以通过嵌入一个字符来解决,该字符只能以隐藏字段中的一种 Unicode 编码形式编码,比如✔。

于 2013-03-17T11:14:57.543 回答