包括的なサーバー側の検証
-
02-07-2019 - |
質問
現在、かなり堅牢なサーバー側検証システムを導入していますが、すべての角度をカバーできるようにするためのフィードバックを探しています。以下は、私が現在行っていることの概要です:
-
入力が空でないか、長すぎることを確認します
-
SQLインジェクションを防ぐためにクエリ文字列をエスケープする
-
正規表現を使用して無効な文字を拒否します(これは送信される内容によって異なります)
-
<!> lt; script <!> gt;などの特定のhtmlタグのエンコード(すべてのタグはデータベースに保存されるときにエンコードされ、一部はページでレンダリングするようにクエリされるときにデコードされます)
足りないものはありますか?コードサンプルまたは正規表現を歓迎します。
解決
<!> quot; Escape <!> quot;する必要はありません。 SQLインジェクションを防ぐためのクエリ文字列-代わりに準備済みステートメントを使用する必要があります。
理想的には、入力フィルタリングは他の処理の前に行われるため、常に使用されることがわかっています。それ以外の場合は、1つのスポットを見逃すだけで問題に脆弱になるためです。
XSS攻撃を防ぐために、出力でHTMLエンティティをエンコードすることを忘れないでください。
他のヒント
「無効な」タグだけでなく、すべてのhtmlタグをエンコードする必要があります。これは熱い議論ですが、基本的には、正しく処理するのを忘れる無効なHTMLの組み合わせが常に存在することになります(ネストされたタグ、一部のブラウザーが「正しく」解釈するタグの不一致など)。したがって、私の意見で最も安全なオプションは、すべてをhtmlentitiesとして保存し、出力時に、コンテンツから検証済みのHTMLセーフサブセットツリーを(エンティティとして)印刷することです。
タスク専用のライブラリですべてのサーバー側検証を実行して、1つの領域の改善がすべてのアプリケーションに影響するようにします。
さらに、ディレクトリトラバーサルやシェルへのアクセス試行などの既知の攻撃に対する作業を含めます。
この質問/回答には、あなたが探している良い回答があります
( PHP指向ですが、言語/プラットフォームを指定しなかったため、その一部はphpの世界を超えて適用されます):
データフィルタリングについては、フィルター拡張機能をご覧ください。完全に気密であることを保証するものではありませんが、個人的には、コードには目を見張るものがたくさんあるので、使用したほうがずっといいと感じています。
また、準備されたステートメントが出向することを考慮してください。 SQLクエリでのデータのエスケープは過去のものです。