PHP でユーザー入力をサニタイズするにはどうすればいいですか? 質問する

PHP でユーザー入力をサニタイズするにはどうすればいいですか? 質問する

特定の種類の HTML タグを許可しながら、SQL インジェクションや XSS 攻撃に対するユーザー入力のサニタイズに適した包括的な関数はどこかにありますか?

ベストアンサー1

ユーザー入力をフィルタリングできるというのはよくある誤解です。PHPには、(現在は廃止された)「機能」がありました。魔法の引用符、このアイデアに基づいています。それはナンセンスです。フィルタリング(またはクリーニング、または人々が何と呼んでも)は忘れてください。

問題を回避するためにすべきことは、非常に簡単です。外部コード内にデータを埋め込むときはいつでも、そのコードのルールに従ってフォーマットする必要があります。ただし、そのようなルールは複雑すぎて、すべて手動で従おうとすると複雑になる可能性があることを理解する必要があります。たとえば、SQL では、文字列、数値、識別子のルールはすべて異なります。ほとんどの場合、利便性のために、そのような埋め込み専用のツールがあります。たとえば、SQL クエリでデータを使用する必要がある場合、変数を SQL 文字列に直接追加するのではなく、クエリ内のパラメーターを介して準備されたステートメントを使用して実行する必要があります。これにより、適切なフォーマットがすべて処理されます。

もう一つの例はHTMLです。HTMLマークアップ内に文字列を埋め込む場合は、次のようにエスケープする必要があります。htmlspecialchars. これは、すべてのechoorprintステートメントで を使用する必要があることを意味しますhtmlspecialchars

3つ目の例はシェルコマンドです。外部コマンドに文字列(引数など)を埋め込み、次のように呼び出す場合、exec、使用するにはescapeshellcmdそしてescapeshellarg

また、非常に説得力のある例としてJSONがあります。ルールは非常に多く複雑であるため、手動ですべてに従うことは不可能です。そのため、JSON文字列を手動で作成することは絶対に避け、常に専用の関数を使用してください。json_encode()すべてのデータビットを正しくフォーマットします。

などなど…

データを積極的にフィルタリングする必要があるのは、フォーマット済みの入力を受け入れる場合のみです。たとえば、サイトに表示する予定の HTML マークアップをユーザーに投稿させる場合などです。ただし、フィルタリングをどれだけうまく行っても、常に潜在的なセキュリティ ホールとなるため、これは絶対に避けるべきです。

おすすめ記事