$new = htmlspecialchars("テスト", ENT_QUOTES);
ストリップタグ($text,);
5) 関連する関数のフィルタリングについては、先ほどの include()、unlink、fopen() などと同様に、操作したい変数を指定するか、関連する文字を厳密にフィルタリングすればよいと思います。完璧になります。
2. PHPによる簡単なデータフィルタリング
1)ストレージ:trim($str),addslashes($str)
2) 出力:stripslashes($str)
3) 表示: htmlspecialchars(nl2br($str))
dispatch.php スクリプトの詳細については、以下の例を参照してください:
コードは次のとおりです |
|
/* グローバルセキュリティ処理 */
スイッチ ($_GET['タスク'])
{
ケース「print_form」:
'/inc/presentation/form.inc' を含めます;
休憩;
ケース「プロセスフォーム」:
$form_valid = false;
'/inc/logic/process.inc' を含めます;
if ($form_valid)
{
'/inc/presentation/end.inc' を含めます;
}
それ以外
{
'/inc/presentation/form.inc' を含めます;
}
休憩;
デフォルト:
'/inc/presentation/index.inc' を含めます;
休憩;
}
?>
|
これが公的にアクセス可能な唯一の PHP スクリプトである場合、そのプログラムは、最初のグローバル セキュリティ処理がバイパスできないように設計されていると確信できます。また、開発者は特定のタスクの制御フローを簡単に確認できます。たとえば、コード全体を閲覧しなくても簡単にわかります。$form_valid が true の場合、end.inc は process.inc がインクルードされる前であり、false に初期化されたばかりであるため、ユーザーに表示される唯一のものです。 process.inc の内部ロジックによって true に設定されると判断できます。それ以外の場合は、フォームが再度表示されます (関連するエラー メッセージが表示される可能性があります)。
注意
(dispatch.php ではなく)index.php などのディレクトリ指定のファイルを使用する場合は、http://example.org/?task=print_form のように URL アドレスを使用できます。
ApacheForceType リダイレクトまたは mod_rewrite を使用して、URL アドレス http://example.org/app/print-form を調整することもできます。
メソッドが含まれます
もう 1 つの方法は、すべてのセキュリティ処理を担当する単一のモジュールを使用することです。このモジュールは、すべてのパブリック PHP スクリプトの先頭 (または最先頭) に含まれています。以下の security.inc スクリプトを参照してください
コードは次のとおりです |
|
スイッチ ($_POST['form'])
{
ケース「ログイン」:
$allowed = array();
$allowed[] = 'フォーム';
$allowed[] = 'ユーザー名';
$allowed[] = 'パスワード';
$sent = array_keys($_POST);
if ($allowed == $sent)
{
'/inc/logic/process.inc' を含めます;
}
休憩;
}
?>
|
この例では、送信された各フォームには一意の検証値フォームが含まれているとみなされ、security.inc はフィルタリングが必要なフォーム内のデータを独立して処理します。この要件を実装する HTML フォームは次のようになります:
$allowed という配列は、フォームが処理される前に、どのフォーム変数が許可されているかを確認するために使用されます。プロセス制御は何を実行するかを決定し、実際のフィルター処理されたデータは process.inc に到着します。
注意
security.inc が常にすべてのスクリプトの先頭に含まれるようにするより良い方法は、auto_prepend_file 設定を使用することです。
フィルタリングの例
ホワイトリストの確立はデータフィルタリングにとって非常に重要です。遭遇する可能性のあるすべてのフォーム データの例を示すことは不可能なので、いくつかの例は一般的な理解を得るのに役立ちます。
次のコードは電子メール アドレスを検証します:
コードは次のとおりです |
|
$clean = array();
$email_pattern = '/^[^@s<>]+@([-a-z0-9]+.)+[a-z]{2,}$/i';
if (preg_match($email_pattern, $_POST['email']))
{
$clean['email'] = $_POST['email'];
}
?>
|
次のコードは、$_POST['color'] の内容が赤、緑、または青であることを確認します。
コードは次のとおりです
|
|
$clean = array();
スイッチ ($_POST['color'])
{
ケース「レッド」:
ケース「グリーン」:
ケース「ブルー」:
$clean['color'] = $_POST['color'];
休憩;
}
?>
|
次のコードは、$_POST['num'] が整数であることを確認します。
コードは次のとおりです
|
|
$clean = array();
if ($_POST['num'] == strval(intval($_POST['num'])))
{
$clean['num'] = $_POST['num'];
}
?>
|
次のコードは、$_POST['num'] が浮動小数点数 (float) であることを確認します。
コードは次のとおりです
|
|
$clean = array();
if ($_POST['num'] == strval(floatval($_POST['num'])))
{
$clean['num'] = $_POST['num'];
}
?>
名前変換
これまでのすべての例では、配列 $clean を使用しました。これは、開発者がデータに潜在的に脆弱性があるかどうかを判断するための良い方法です。 データを検証した後は、決して $_POST または $_GET にデータを保存しないでください。開発者は、スーパー グローバル配列に保存されたデータを常に完全に疑う必要があります。
追加する必要があるのは、$clean を使用すると、フィルターされていないものについて考えるのに役立ち、ホワイトリストの役割に近いということです。セキュリティレベルを向上させることができます。
検証済みのデータのみを $clean に保存する場合、データ検証における唯一のリスクは、参照する配列要素が存在しないことであって、フィルターされていない危険なデータではありません。
タイミング
PHP スクリプトの実行が開始されると、すべての HTTP リクエストが終了したことになります。この時点では、ユーザーがスクリプトにデータを送信する機会はありません。したがって、(register_globals がオンになっている場合でも) スクリプトにデータを入力することはできません。このため、変数を初期化することは非常に良い方法です。
抗注射
コードは次のとおりです |
|
//PHP サイト全体のアンチインジェクション プログラム、このファイルをパブリック ファイルに require_once する必要があります
//magic_quotes_gpc ステータスを決定する
if (@get_magic_quotes_gpc ()) {
$_GET = 秒 ( $_GET );
$_POST = 秒 ( $_POST );
$_COOKIE = 秒 ( $_COOKIE );
$_FILES = 秒 ( $_FILES );
}
$_SERVER = 秒 ( $_SERVER );
関数 sec(&$array) {
// 配列の場合は、配列を走査して再帰的に呼び出します
if (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = 秒 ( $v );
}
} else if (is_string ( $array )) {
//addslashes関数を使って処理します
$array = ラッシュを追加します ( $array );
} else if (is_numeric ( $array )) {
$array = 整数 ( $array );
}
$配列を返す
}
//整数フィルター関数
関数 num_check($id) {
if (! $id) {
die ( 'パラメータを空にすることはできません!' );
} //空かどうかを判断する
else if (inject_check ( $id )) {
die ('不正なパラメータ' );
} //判定を注入する
else if (! is_numetic ( $id )) {
die ('不正なパラメータ' );
}
//数値判定
$id = 整数 ( $id );
//整数化
$id を返す
}
//文字フィルター関数
関数 str_check($str) {
if (inject_check ( $str )) {
die ('不正なパラメータ' );
}
// 判定を注入する
$str = htmlspecialchars ( $str );
//HTMLを変換する
$str を返します。
}
関数 search_check($str) {
$str = str_replace ( "_", "_", $str );
//「_」をフィルターで除外します
$str = str_replace ( "%", "%", $str );
//「%」を除外します
$str = htmlspecialchars ( $str );
//HTMLを変換する
$str を返します。
}
//フォームフィルター関数
関数 post_check($str, $min, $max) {
if (isset ( $min ) && strlen ( $str ) < $min) {
die ('最小 $min バイト');
} else if (isset ( $max ) && strlen ( $str ) > $max) {
die ('$max バイトまで');
}
ストリップスラッシュ配列を返します ( $str );
}
//アンチインジェクション関数
関数 inject_check($sql_str) {
return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );
// www.111cn.net フィルタリングとインジェクション防止用
}
関数tripslashes_array(&$array) {
if (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = ストリップスラッシュ_配列 ( $v );
}
} else if (is_string ( $array )) {
$array = ストリップスラッシュ ( $array );
}
$配列を返す
}
?>
|
http://www.bkjia.com/PHPjc/737681.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/737681.html技術記事 1. PHP 送信データのフィルタリングの基本原則 1) データベースに変数を送信するときは、addslashes() を使用してフィルタリングする必要があります。たとえば、挿入の問題は 1 つの addslashes() だけで解決できます。それは...
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。 |