2

'username'という変数へのユーザー入力をサニタイズする次のコードがあります。

$username_clean = preg_replace( "/[^a-zA-Z0-9_]/", "", $_POST['username'] );

if (!strlen($username_clean)){

die("username is blank!");

このページの各入力で同じプロセスを実行したいのですが、登録フォームであるため、約12の異なる入力があります。preg_replace()とifステートメントをそれぞれに適用する代わりに、各入力をサニタイズしてチェックする簡単な方法はありますか?

4

2 に答える 2

5

のすべての要素を$_POSTサニタイズする場合は、サニタイズ関数を作成して、次のようにすべての要素に適用できますarray_map

$post_clean = array_map("sanitization_function", $_POST);

$post_clean次に、の代わりにを介して変数にアクセスします$_POST

次のようになります。

function sanitize($dirty){ 
    return preg_replace( "/[^a-zA-Z0-9_]/", "", $dirty ); 
}

$cPOST = array_map("sanitize", $_POST);

if (!strlen($cPOST['username'])){ 
    die("username is blank!"); 
}

要素のサブセットのみをサニタイズしたい場合は、次の$_POSTようにすることができます。

$cPOST = array();
$sanitize_keys = array('username','someotherkeytosanitize');
foreach($_POST as $k=>$v)
{
    if(in_array($k, $sanitize_keys))
    {
        $cPOST[$k] = preg_replace( "/[^a-zA-Z0-9_]/", "", $v);
    }
    else
    {
        $cPOST[$k] = $v;
    }
}

これを試して:

$cPOST = array();
$sanitize_keys = array('username','someotherkeytosanitize');
for($_POST as $k=>$v)
{
    if(in_array($k, $sanitize_keys))
    {
        $cPOST[$k] = preg_replace( "/[^a-zA-Z0-9_]/", "", $v);
        if(strlen($cPOST[$k]) == 0){ 
            die("%s is blank", $k);
        }
    }
    else
    {
        $cPOST[$k] = $v;
    }
}
# At this point, the variables in $cPOST are the same as $_POST, unless you 
# specified they be sanitized (by including them in the $sanitize_keys array.
# Also, if you get here, you know that the entries $cPOST that correspond
# to the keys in $sanitize_keys were not blank after sanitization.

$ sanitize_keysを、サニタイズする変数(または$ _POSTキー)の配列に変更してください。

于 2012-04-10T18:24:54.657 に答える
1

正規表現と失敗のテストが同じである場合は、次の関数を記述できます。

function validate($input, $input_name) {
  $clean_input = preg_replace( "/[^a-zA-Z0-9_]/", "", $input );
  if (!strlen($username_clean)){
    die("$input_name is blank!");
  }
  return $clean_input;
}
validate($_POST['username'], "Username");
于 2012-04-10T18:24:26.390 に答える