この話題は大間違い!
ユーザーの入力をフィルタリングしないでください。彼が入力した情報です。パスワードを次のようにしたい場合、あなたはどうしますか?'"'>s3cr3t<script>alert()</script>
文字をフィルタリングしてパスワードを変更したままにしておくと、最初のログインでさえ成功できませんか? これは悪いです。
適切な解決策は、準備されたステートメントを使用するかmysql_real_escape_string()
、SQL インジェクションを回避し、文字のコンテキスト認識エスケープを使用して、HTML コードが台無しにならないようにすることです。
Web は、ユーザーが入力した情報を表す方法の 1 つにすぎないことを思い出してください。一部のデスクトップソフトウェアがそれを行う場合、そのようなストリッピングを受け入れますか? あなたの答えが NO であることを願っています。
異なるコンテキストでは、異なる文字をエスケープする必要があることに注意してください。たとえば、ユーザーの名をツールチップとして表示する必要がある場合は、次のように使用します。
<span title="{$user->firstName}">{$user->firstName}</span>
しかし、ユーザーが自分の名前を次のように設定した場合、'"><script>window.document.location.href="http://google.com"</script>
あなたはどうしますか? 引用符を削除しますか?これはとても間違っているでしょう!この無意味なことをする代わりに、データを永続化するときではなく、データをレンダリングするときに引用符をエスケープすることを検討してください!
考慮すべきもう 1 つのコンテキストは、値自体のレンダリング中です。以前に使用された html コードを考えて、ユーザーの名前が のようになっていると想像してください<textarea>
。これにより、後続のすべての html コードがこの textarea 要素にラップされ、ページ全体が分割されます。
繰り返しになりますが、使用しているコンテキストに応じてデータをエスケープすることを検討してください!
PSこれらの否定的な投票にどのように反応するかはよくわかりません。皆さん、私の返事を実際に読んでいますか?