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 Web サイトに「話しかける」ように構成されたブラウザーからの情報を見逃さないようにすることです。