一般的に、最初は「あなたの保護のために、そしてそれらのもの」を浄化しなければなりません。これには、無効な文字(文字コードの区別はもちろん)を取り除くことが含まれます。フィールドに文字とスペースのみを含める必要がある場合は、最初にないものを除外します。
これを実行すると、結果が検証されます。すでに使用されている名前(固有のフィールドの場合)は正しいサイズですか、空白ではありませんか?
あなたが与えた理由は、正確にはユーザーエクスペリエンスを最大限にするためです。あなたがそれを避けることができれば、ユーザーを混乱させないでください。これはダムコピー&貼り付けの動作から保護するのに役立ちますが、 "Ke $ h @"として記録された名前を使用したい場合は、 "Keh"に変更してもOKであることがあります。
第2に、バグを防ぐことでもあります。
特殊文字を許可しないユーザー名を作成するとどうなりますか?私が "Brian"と入力して、あなたのシステムがそれを既に使用中の名前として拒否した場合、私は "Brian $"を提出しますか?最初にそれを検証し、それが使用されていない場合、特殊文字を取り除き、 "Brian"を残します。うーん、今、あなたはもう一度妥当性チェックをしなければならないか、アカウントの作成に失敗した(データベースがユニークなユーザー名を要求するように設定されている場合)か、悪化するとそれが成功しオーバーライト/破損ユーザーのユーザーアカウントに発生します。
もう1つの例は、フィールドの長さの最小値です。名前の長さが3文字以上で、文字のみを受け入れる必要があり、「いいえ」と入力すると拒否します。しかし、「no @#$%」と入力すると、それが有効であるといってもいいかもしれませんが、それを消毒してもう有効ではありません。
これを避ける簡単な方法は、そして、あなたは検証について二重に考える必要はありません。
しかし、Nietは保存前にデータをエンコードしていないのが正しいです。適切なときにエンコードされるように出力をHTMLにセットアップする方が一般的にはるかに簡単です。プレーンテキスト(テキストボックス、JSON文字列などへの入力)が必要な場合は、デコードすることを忘れないようにしてください。ほとんどのテストケースでは、HTMLエンティティのデータは含まれないため、簡単にキャッチされないばかげたバグを簡単に導入できます。
大きな問題は、このようなバグが導入された場合、簡単には解決できないデータ破損にすぐにつながることです。例:プレーンテキストを持ち、HTMLエンティティとしてテキストフィールドに間違って出力し、フォームが返され、再エンコードされます。開かれた/再送信されるたびに再エンコードされます。ビジー状態のサイト/フォームでは、何千ものエンコードされたエントリで終わる可能性があります。何がHTMLでエンコードされるべきではないかを決定する明確な方法はありません。
注射からの保護は優れていますが、これを行うにはHTMLエンコーディングは設計されておらず(信頼してはいけません)、
データを保存する前にエンコードする必要はありません。 mysqli_real_escape_stringなどの適切なエスケープを使用してそのままの状態で保存し、出力する前にエンコードします。これは、HTMLやJSONなどで出力する場合、別のエンコーディングが必要なためです。 –
SQLインジェクションを止める最善の方法は、データベースにデータを挿入するためにmysqliまたはPDOプリペアドステートメントを使用することです。@ [Niet the Dark Absol](http://stackoverflow.com/users/507674/niet-the-dark-absol)is is mysqli_real_escape_string()関数は推奨されていません。 – nurakantech
私は 'mysqli_real escape_string()'のような関数を使用することはありません。pdoを使うとより安全です。 – naazanin