1

重複の可能性:
最高の PHP 入力サニタイズ関数は何ですか?

しばらく前に、これを見つけました。これは、私が素晴らしいと思ったもので、インジェクションから POST および GET データをフィルタリングするための誰かのコードのスニペットです。

function filter($data) { //Filters data against security risks.
    $data = trim(htmlentities(strip_tags($data)));
    if(get_magic_quotes_gpc()) $data = stripslashes($data);
    $data = mysql_real_escape_string($data);
    return $data;
}
foreach($_GET as $key => $value) $filterGet[$key] = filter($value);
foreach($_POST as $key => $value) $filterPost[$key] = filter($value);

それ以来、私はそれを使用しています。しかし、今日、ajax を介して配列を送信しているときに、大量のエラーが発生しました。彼らのほとんどは言うstrip_tags() expects parameter 1 to be string, array given in...

データをフィルタリングする最良の方法は何ですか? このデータはすべてデータベースに送られます。しかし、データベースに送信されない場合はどうでしょうか?

4

5 に答える 5

4

必要な機能は次のとおりです。

function filter($data) { //Filters data against security risks.
    if (is_array($data)) {
        foreach ($data as $key => $element) {
            $data[$key] = filter($element);
        }
    } else {
        $data = trim(htmlentities(strip_tags($data)));
        if(get_magic_quotes_gpc()) $data = stripslashes($data);
        $data = mysql_real_escape_string($data);
    }
    return $data;
}
于 2012-12-12T07:51:08.987 に答える
1

エラー メッセージで明らかなように、これは配列が GET/POST 経由で渡される場合に発生します。このような場合は、配列の各値を解析できます。

foreach($_GET as $key => $value){
   if(is_array($value)){
       foreach($value as $val){
           $filterGet[$key][] = filter($val);
       }
   }
   else{
         $filterGet[$key] = filter($value);
   }
}
于 2012-12-12T07:41:05.517 に答える
0

array_walk を使用できます

<?php
function wsafe(&$value,$key)
{
    return safe($value);
}
function safe($value)
{
    if(is_array($value))
    {
        foreach($value as $key=>$val)
        {
            $value[safe($key)] = safe($val);
        }
    }
    else
    {
        $value = trim(htmlentities(strip_tags($value)));
        if(get_magic_quotes_gpc()) $value = stripslashes($value);
        $value = mysql_real_escape_string($value);
    }
}
array_walk($_POST,'wsafe');
array_walk($_GET,'wsafe');
于 2012-12-12T07:54:58.270 に答える
0

あなたがすべきことは、最初に $data が必要な正しい形式であるかどうかを確認することです。あなたが説明するのは、配列が関数の $data パラメータに渡され、PHP がそれを分解する必要があるということです。文字列に。次のような追加のロジックが必要です。

function filter($data) {
    if(is_array($data)) {
        foreach($data as $key => $value) {
            // Do stuff...
        }
    } else {
        // Do stuff...
    }
}
于 2012-12-12T07:43:00.990 に答える
0

入力が配列かどうかを確認する必要があります。そうであれば、それをループしてすべての配列メンバーのタグを削除します。そうでない場合は、入力のタグを削除します。

于 2012-12-12T07:47:41.573 に答える