この記事では、アプリケーションに組み込まれているものをすべてフィルタリングすることがなぜ重要なのかを見ていきます。 特に、PHP で外部データを検証してサニタイズする方法を見ていきます。
アプリケーションで外部からの入力を信頼しないでください。 これは、Web アプリケーションを開発する人にとって最も重要な教訓の 1 つです。
外部からの入力は何でもかまいません。 $_GET
と $_POST
フォーム入力データ、HTTP リクエスト本文の一部の要素、または $_SERVER
スーパーグローバル。 Cookie、セッション値、アップロードおよびダウンロードされたドキュメント ファイルも外部入力と見なされます。
コードに外部データを処理、出力、インクルード、または連結するたびに、攻撃者がアプリケーションにコードを挿入する潜在的なベクトルがあります (いわゆる 注射攻撃)。 このため、アプリケーションに安全に組み込むことができるように、外部データのすべての部分が適切にフィルタリングされていることを確認する必要があります。
フィルタリングに関しては、主に 2 つのタイプがあります。 検証 と 衛生.
検証
検証 外部からの入力が期待どおりであることを保証します。 たとえば、電子メールアドレスを期待している可能性があるため、 ********@*****.***
フォーマット。 そのためには、 FILTER_VALIDATE_EMAIL
フィルター。 ただし、ブール値が必要な場合は、PHP の FILTER_VALIDATE_BOOL
フィルター。
最も便利なフィルターは次のとおりです。 FILTER_VALIDATE_BOOL
、 FILTER_VALIDATE_INT
、 と FILTER_VALIDATE_FLOAT
基本タイプと FILTER_VALIDATE_EMAIL
と FILTER_VALIDATE_DOMAIN
メールとドメイン名をそれぞれフィルタリングします。
もう 1 つの非常に重要なフィルターは、 FILTER_VALIDATE_REGEXP
これにより、正規表現に対してフィルタリングできます。 このフィルターを使用すると、フィルター処理する正規表現を変更してカスタム フィルターを作成できます。
PHP での検証に使用できるすべてのフィルターは、ここにあります。
消毒
消毒 外部入力から不正または安全でない文字を削除するプロセスです。
これの最も良い例は、生の SQL クエリに挿入する前にデータベース入力をサニタイズする場合です。
繰り返しになりますが、最も有用なサニタイズ フィルターには、次のような基本的なタイプをサニタイズするフィルターが含まれます。 FILTER_SANITIZE_STRING
、 FILTER_SANITIZE_CHARS
と FILTER_SANITIZE_INT
、 だけでなく FILTER_SANITIZE_URL
と FILTER_SANITIZE_EMAIL
URL と電子メールをサニタイズします。
すべての PHP サニタイズ フィルタは、ここにあります。
filter_var() と filter_input()
PHP には利用可能なフィルターの全選択肢があることがわかったので、それらの使用方法を知る必要があります。
フィルタの適用は、 filter_var()
と filter_input()
機能。
お茶 filter_var()
関数は、指定されたフィルターを変数に適用します。 フィルターする値、適用するフィルター、およびオプションのオプションの配列を取ります。 たとえば、電子メール アドレスを検証しようとしている場合は、次のように使用できます。
$email = your.email@sitepoint.com:
if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
echo ("This email is valid");
}
目標が文字列をサニタイズすることである場合、これを使用できます。
$string = "Hello World
";
$sanitized_string = filter_var ( $string, FILTER_SANITIZE_STRING);
echo $sanitized_string;
お茶 filter_input()
関数はフォーム入力から外部入力を取得し、それをフィルタリングします。
それはちょうどのように動作します filter_var()
関数ですが、入力のタイプを取ります(から選択できます GET
、 POST
、 COOKIE
、 SERVER
、 金 ENV
)、フィルターする変数、およびフィルター。 オプションで、オプションの配列を取ることもできます。
もう一度、外部入力変数「email」が経由で送信されているかどうかを確認したい場合 GET
私たちのアプリケーションでは、これを使用できます。
if ( filter_input( INPUT_GET, "email", FILTER_VALIDATE_EMAIL ) ) {
echo "The email is being sent and is valid.";
}
結論
そして、これらは PHP でのデータ フィルタリングの基本です。 正規表現の適用など、他の手法を使用して外部データをフィルター処理することもできますが、この記事で説明した手法は、ほとんどのユース ケースで十分です。
検証とサニタイズの違いと、フィルター機能の使用方法を理解していることを確認してください。 この知識があれば、PHP アプリケーションの信頼性と安全性が向上します。