0

私は自分のメインページをframework_ui.phpと呼んでいます。私はフィルタ関数があるところにauth.phpが必要です。

function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes) {
       $data = stripslashes($data);
   }
   // normalize $data because of whitespace on beginning and end
   $data = trim($data);
   // strip tags
   $data = strip_tags($data);
   // replace characters with their HTML entitites
   $data = htmlentities($data);
   // mysql escape string    
   $data = mysql_real_escape_string($data);
   return $data;
}

そして、get 変数と post 変数を含むすべてのページで、次のことを行います (そして、framework.php を呼び出します)。

// filter GET values
foreach ($_GET as $key => $value) {
    $get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
    $post[$key] = filter($value);
} 

上記を関数にして、代わりにすべてのページで呼び出すと、関数は正しく動作しますか?

function filter_all() {
// filter GET values
foreach ($_GET as $key => $value) {
    $get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
    $post[$key] = filter($value);
}
}

これが最も安全な方法ではないことは理解していますが、この種のことが可能であり、コードに悪影響を及ぼさないかどうか疑問に思っていました.

4

2 に答える 2

2

filter_all() 関数は何も返さず、 $_GET および $_POST グローバルを変更しないため、関数が元の変数の実行を終了した後、 foreach ループは事実上同じになります。$_GET/$_POST を直接操作するか、グローバルな $get/$post を使用する予定がある場合は操作するか、2 つの組み合わせを返す必要があります。それ以外には、あなたの計画について必ずしも否定的なものは何もありません。

毎回これを行う場合は、関数を作成せずに、ループを実行して変数をフィルター処理するだけのファイル (framework_ui.php など) を含めることもできます。

zerkms は正しいですが、フィルター関数は安全ではないという点で理想的ではありません。実際、ユーザーが送信した情報を再表示する予定がある場合、mysql_real_escape_string が問題を引き起こします (他の多くのことの中でも)。

OWASP ESAPI プロジェクト ページを引用するには:

独自のセキュリティ コントロールを記述しないでください。すべての Web アプリケーションまたは Web サービスのセキュリティ制御を開発する際に一からやり直すと、時間の浪費と膨大なセキュリティ ホールが発生します。OWASP Enterprise Security API (ESAPI) ツールキットは、ソフトウェア開発者がセキュリティ関連の設計と実装の欠陥から保護するのに役立ちます。http://code.google.com/p/owasp-esapi-php/

于 2012-07-18T22:31:01.133 に答える
1

「フィルタリングされた」値がコードの残りの部分で利用できるようにするために、いくつかの調整を行う必要があります。それを行う方法はいくつかありますglobal。おそらく、2 番目のオプションの方が一般的にクリーンであると考えられています。次に例を示します。

function filter_all() {
    $get  = array();
    $post = array();

    // filter GET values
    foreach ($_GET as $key => $value) {
        $get[$key] = filter($value);
    }
    // filter post
    foreach ($_POST as $key => $value) {
        $post[$key] = filter($value);
    }
    return array(
            'get'  => $get,
            'post' => $post);
}

$aFilteredInput = filter_all();
$get  = $aFilteredInput['post'];
$post = $aFilteredInput['post'];
于 2012-07-18T22:26:19.460 に答える