使用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 => Þ~Ç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 网站“对话”。