0

可能な名には何千もの可能な文字が含まれる可能性があるため、厳密になりすぎないようにします。

通常の英語のアルファベット、アクセント付き文字、英語以外の文字、数字(??)、一般的な句読点記号

例えば

D'souza
D'Anza
M.D. Shah (dots and space)
Al-Rashid
Jatin "Tom" Shah

ただし、HTMLタグ、セミコロンなどを除外したくありません

Webアプリケーションの観点から絶対に悪いそのような文字のリストはありますか?

次に、RegExを使用してこれらの文字をブラックリストに登録できます

私のアプリケーションの背景

これは、Javaサーブレット-JSPベースのWebアプリです。バックエンドとしてMySQL(場合によってはMongoDB)を使用するLinux上のTomcat

私がこれまでに試したこと

String regex = "[^<>~@#$%;]*";
if(!fname.matches(regex))
    throw new InputValidationException("Invalid FirstName")

私の質問はコーディングよりもデザインに関するものです...私はブラックリストに載せるべき文字の網羅的な(かなりの程度まで網羅的な)リストを探しています

4

1 に答える 1

0

より良いアプローチは、誰もが入力したいものをすべて受け入れ、問題を引き起こす可能性のあるコンテキストで問題のある文字をエスケープすることです。

たとえば、人々<i>が自分の名前に使用することを禁止する理由はなく (正当な名前である可能性は非常に低いかもしれませんが)、ユーザーのために HTML を生成している場合にのみ潜在的な問題 (XSS) を引き起こします。同様に、引用符やセミコロンなどを許可しないことは、他のシナリオ (SQL クエリなど) でのみ意味があります。場所によってルールが異なり、inputをサニタイズしたい場合は、同じ場所にすべてのルールが必要です (空白についてはどうですか? ユーザーの名を含むファイル名を作成しますか? もしそうなら、多分あなたはブラックリストに追加します)。

少なくとも 1 つのケースで間違いを犯すと仮定します。最初の実装で考慮しなかったことがある可能性があるため、戻って新しいアイテムをブラックリストに追加します。汚染されたデータで既に登録しているユーザーがまだいます。したがって、データベース全体を実行してデータをサニタイズするか (非常 長い時間がかかる可能性があります)、またはとにかく本当にやらなければならないことを実行するか、現在のメディアで提示されているデータをサニタイズすることができます。そうすれば、関連するポイントでサニタイズを管理するだけで済み (SQL インジェクション攻撃から HTML 出力を保護する必要はありません) ブラックリストを実装した後に収集するデータだけでなく、すべてのデータに対して機能します。

于 2012-06-11T18:56:46.993 に答える