重複の可能性:
究極のクリーン/セキュア機能
$_GET 受信データに必要なものだけが含まれ、他の危険な文字などが含まれないようにするための解決策を探しています。REGEXP は、ここで何らかの役割を果たすことができると思います。
if (isset($_GET['p'])) {
//validate //sanitize etc...
//call controller... or whatever.
}
重複の可能性:
究極のクリーン/セキュア機能
$_GET 受信データに必要なものだけが含まれ、他の危険な文字などが含まれないようにするための解決策を探しています。REGEXP は、ここで何らかの役割を果たすことができると思います。
if (isset($_GET['p'])) {
//validate //sanitize etc...
//call controller... or whatever.
}
入力を検証またはサニタイズするには、PHP のフィルター関数を使用します。
検証は、データが特定の条件を満たしているかどうかを検証または確認するために使用されます。たとえば、渡すと
FILTER_VALIDATE_EMAIL
、データが有効な電子メール アドレスであるかどうかが判断されますが、データ自体は変更されません。サニタイズはデータをサニタイズするため、不要な文字を削除してデータを変更する場合があります。たとえば、渡すと
FILTER_SANITIZE_EMAIL
、電子メール アドレスに含めるのに不適切な文字が削除されます。つまり、データを検証しません。
データを表示したい場合は、HTML エンティティをエスケープする必要があります。htmlentities関数を使用してこれを行うことができます。
データをデータベースに保存しますか? データベースへの接続方法 (MySQL 関数、MySQLi または PDO) に応じて、(それぞれ) mysql_real_escape_string、mysqli::real_escape_string または mysqli_real_escape_string、またはPDO::quoteまたはprepare statementを使用する必要があります。
URL で値を使用しますか? 次に、 urlencode関数を使用する必要があります。
$_GET パラメータの内容によって異なります。REGEX または文字列関数を使用して、不要な文字を削除します。例: 変数がページ番号の場合、番号以外のものはすべて削除します。ある種のソート値である場合は、可能な値 (asc/desc/...) を確認し、残りを削除します。必要なコンテンツだけを保管してください。これが最も安全な方法です。
他のコンテンツについては、urlencode()およびurldecode()を使用して、可能なすべての文字を渡すことができます。ただし、この入力を他の目的 (DB への保存やデータの表示など) に使用する場合は注意してください。$_GET パラメータの内容をエンコードするには、常にmysql_real_escape_string()、htmlentities()などの関数を使用してください。
あなたの質問を正しく理解できれば、パーセントエンコーディングを使用できます。詳細はこちら。
PHP では、次のようになります。
<?php
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>