1. ホーム
  2. php

[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?

2022-03-20 11:18:53

質問

SQLインジェクションやXSS攻撃のためにユーザー入力をサニタイズしつつ、特定のタイプのHTMLタグを許可するためにうまく機能するキャッチオール機能はどこかにありますか?

どのように解決するのですか?

ユーザーの入力にフィルターをかけることができるというのは、よくある誤解です。PHPには、(現在では非推奨の)"機能"と呼ばれるものがあります。 マジッククオート この考えに基づいています。ナンセンスです。フィルタリング(またはクリーニング、あるいは人々が何と呼ぼうとも)のことは忘れてください。

あるデータをあるコードに埋め込むときは、そのコードの書式規則に従って処理しなければならないのです。しかし、そのようなルールはあまりにも複雑で、手作業ですべて守ろうとすると大変なことになることを理解しておかなければなりません。例えば、SQLでは、文字列、数値、識別子のルールはすべて異なっています。便利なように、ほとんどの場合、そのような埋め込みを行うための専用のツールがあります。例えば、SQLクエリでPHP変数を使用する必要がある場合、プリペアドステートメントを使用する必要があり、それはすべての適切なフォーマットと処理の世話をします。

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

3つ目の例として、シェルコマンドを挙げることができる。もし、外部コマンドに文字列(引数など)を埋め込み、それを exec を使用する必要があります。 escapeshellcmd escapeshellarg .

また、非常に説得力のある例として、JSONがあります。ルールは非常に多く複雑で、手作業ですべてをフォローするのは不可能でしょう。そのため、JSONの文字列は決して手動で作成せず、必ず専用の関数を使用する必要があります。 json_encode() は、すべてのデータを正しくフォーマットしてくれます。

などなど・・・。

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