3

ユーザーがいくつかのテキスト フィールドを含むフォームを送信できるようにするとします (パスワードの話ではありません)。ユーザーはロシア語や中国語などの非 ASCII 文字を使用することがあるので、データベースでは UTF-8 文字セットを使用しています。問題は、考えられるすべての UTF-8 文字を本当に許可する必要があるかということです。ASCII テーブルを調べたところ、0 から 31 までの文字は、改行と空白を除いて、テキストとは何の関係もないことがわかりました。文字 176 から 223 は装飾目的のようです :p. それらを制限する必要がありますか?

4

4 に答える 4

6

W3C は、多言語フォーム エンコーディングの正規表現の例でこれらの文字をスキップします。

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;
于 2009-08-11T22:37:24.467 に答える
5

有効な UTF-8 および Unicode であることを確認してください。 はい

制御コードなどの特定の文字が含まれていないことを確認してください。 おそらく必要ない

フォームで UTF-8 を使用していても、ユーザー エージェントがフォーム データを送信するときに、すべてのユーザー エージェントから有効な UTF-8 を取得できない可能性があることに注意してください。必要に応じてフィルタリングする必要があります。無効な UTF-8 は多くの形式を取ることができます。

  • 長すぎるエンコーディング (セキュリティの問題につながる可能性があります)
  • その他の無効な UTF-8 バイト シーケンス。これは、ユーザー エージェントが文字エンコーディングを無視し、代わりに Windows-1252 または ISO-8859-1 エンコーディングなどを送信したことを示している可能性があります。
  • Unicode の予約されたサロゲート スペースにあるコード ポイント

上記のすべてを入力中に除外する必要があります。そうしないと、有効な Unicode を格納できません。

Unicode のサブセットを使用する有効な HTML または XHTML を提供する場合は、(入力または出力のいずれかで) 除外する必要もあります。

  • C0 制御コード 0x00 ~ 0x19 (タブ、スペース、改行、改行を除く)
  • 0x7F
  • C1 制御コード 0x80 ~ 0xBF
  • (おそらく) 0x10FFFF を超える任意のコード ポイント
于 2009-08-12T07:23:59.503 に答える
1

いいえ。

ユーザー入力を「事前にクリーンアップ」しようとするのは非常に悪い考えです。あなたが「装飾的」と考えるものは、他の言語の読者にとって絶対に必要なものかもしれません. 最善の解決策は、テキストをそのままデータベースに保存し、ページに書き込む前にサニタイズすることです。

于 2009-08-11T22:39:17.130 に答える