8

明らかに$dataは文字列であり、reg式を満たす文字を削除していますが、/ [\ xF0- \ xF7] ... /で指定されている文字は何ですか?

 preg_replace('/[\xF0-\xF7].../', '', $data)

また、これらの文字が置き換えられることの意味は何ですか?

報奨金のために編集:具体的には、これが発生を防ぐためにどのようなエクスプロイトを試みていますか?データは後でmysqlクエリ(非pdo)で使用されるので、おそらくこれらの文字に何らかのインジェクション攻撃が関係していると思いますか?か否か?読んでいるスクリプトで、このコード行の背後にあるロジックを理解しようとしています。

4

3 に答える 3

20

Unicode文字列から4バイトのシーケンスを削除します。これらの最初のバイトは常に[\xF0-\xF7]であり、3つのドットが残りの3バイトです。

http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.htmlによると:

utf8という名前の文字セットは、文字ごとに最大3バイトを使用し、BMP文字のみを含みます。

utf8エンコーディングが選択されているMySQLは、シーケンスが表示されるポイントでテキストを切り捨てる場合があり、エラーレポートが設定されstrict_trans_tablesていない場合は、のようなエラーをスローする代わりにサイレントに切り捨てる場合がありますSQLSTATE[HY000]: General error: 1366 Incorrect string value:

詳細については、以下を参照してください。

切り捨てられる可能性があると、悪用につながる可能性があります。

たとえば、。という名前のユーザーがいるWebサイトがありますadmin。ウェブサイトでは誰でも登録できます。切り捨てられた文字列を使用するとadmin、一意のチェックをバイパスして、別の電子メールを挿入できる可能性があります。次に、アカウントを一時停止し、復元手順を使用してみてください。SELECT * FROM users WHERE name = 'admin'元の管理者が最初のレコードであるため、攻撃者は自分のパスワードを復元します。

于 2014-01-13T23:25:28.643 に答える
1

これは、8バイトの値の1つに加えて、それに続く3文字と一致し、4文字のブロックを削除します。あなたがすでに知っているとあなたが言うそのくらい。残念ながら、これ以上のコンテキストがなければ、これらの特定の8バイトが重要である理由を説明することはできません。それらがどの文字グリフを表すか(文字エンコード)に関係なく、それ自体は無害です。私の最も良い推測は、アプリケーションでは、これは、ある種のマーカーとしてのこれらの8文字に何らかの重要性があることから来ていると思います。0xF0は、32ビット(4バイト)のUTF-8文字の最初のバイトである11110xxxです。したがって、32ビットのUTF-8文字をすべて削除するのではないでしょうか。16ビット文字と24ビット文字(110xxxxxと1110xxxxの最初のバイト)は同様に扱われますか?

于 2014-01-13T23:25:41.693 に答える
0

preg_replace('/[\xF0-\xF7].../', '', $data)交換:

(xF0からxF7)+空の文字列を持つ次の3文字(+記号は連結を表し、加算ではありません)

于 2014-01-20T17:09:17.967 に答える