当前位置: 首页 > 知识库问答 >
问题:

使用白名单对用户输入进行净化

赫连彬炳
2023-03-14

我有这样的代码,它对名为'username'的变量的用户输入进行了净化:

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

if (!strlen($username_clean)){

die("username is blank!");

我想对这个页面上的每个输入执行相同的过程,但我有大约12个不同的输入,因为它是一个注册表单。有没有更简单的方法来清理和检查每个输入,而不是对每个输入应用preg_replace()和if语句?

共有2个答案

汪胡非
2023-03-14

如果regex和test for failure相同,则可以编写一个函数:

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");
郎河
2023-03-14

如果您希望清理$_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 keys)的数组。

 类似资料:
  • 我必须测试一个类中的一个方法,它接受一个使用扫描器类的输入。 我想使用JUnit测试它,但不确定如何进行。 我尝试使用下面的代码,但它不起作用。 我也想用Mockito(使用mock...when...thenReturn),但不确定如何做。

  • 问题内容: 我只是在玩输入和变量。我正在尝试运行一个简单的功能: 我想提示用户输入,,和。最简单,最干净的方法是什么? 问题答案: 您可以使用该函数提示用户输入,并将用户输入从字符串转换为浮点数: 如果您使用的是python 2,请改用。

  • 我是C++的新手,很可能我做错了什么,导致在输入用户输入值之前,控制台出现了一些随机数`这是代码: 在输入用户输入“”4200347之前,控制台看起来就像这样,这个数字在我输入任何输入之前就出现在控制台上了

  • 问题内容: 我正在尝试像这样使用AngularJS和UI Bootstrap 设置: .html .js 目前,我已经能够使用所选名称更新模型,但是我的目标是通过传递整个对象。有一种干净的方法可以仅使用输入来执行此操作吗? 问题答案: 当然可以:-) 从预输入指令http://angular-ui.github.io/bootstrap/使用作为AngularJS相同的超灵活的语法选择指令进行。所

  • 问题内容: 将[]字节传递到模板中,作为论坛风格的Web应用程序上的消息发布的正文。在模板中,调用一个方法以转换为字符串,并一路切换所有换行符以换行: … 最终结果是: 我不想用HTML(p.Body)传递整个帖子,因为它表示来自潜在不可靠来源的第三方数据。有没有一种方法可以使用Vanilla Go1模板包将仅某些标签用于格式设置白名单? 问题答案: 我确实认为您想解析HTML。exp / htm

  • 问题内容: 我想知道如何编写一个可以接受多行输入的简单程序,然后可以像在lynx浏览器中一样提交输入,在该浏览器中您可以使用空白行然后使用句点来提交输入。 我想在电子邮件程序中使用它。 问题答案: 这是一个简单的方法: