foreach循环不起作用

时间:2011-03-21 14:25:07

标签: php

我正在尝试使用foreach循环来搜索$ _POST中的单词,但它不起作用?帮助是预先确定的。

$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
    foreach ($unsafeWords as $value) {
        $_POST = str_ireplace($value, "", $input) ;
    }
}

6 个答案:

答案 0 :(得分:5)

不要用字符串

覆盖$ _POST数组
$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
    foreach ($unsafeWords as $value) {
        $_POST[$key] = str_ireplace($value, "", $input) ;
    }
}

虽然我不喜欢覆盖原始的$ _POST数组,并且更愿意构建一个新的清理值数组

请注意,您不需要循环$ unsafeWords数组,但可以将其作为数组直接传递给str_ireplace()

修改

使用$ unsafeWords数组作为str_ireplace()的参数的示例,而不是使用foreach()循环遍历它并为每个条目调用str_ireplace()。

$unsafeWords = array('content-type','bcc','cc');
foreach ($_POST as $key => $input) {
    $_POST[$key] = str_ireplace($unsafeWords, "", $input) ;
}

并且您没有替换空格,您将使用空字符串替换(有效地从$ _POST变量中删除不安全的字符串)

编辑2

  

我想把它放在里面是可以的   foreach循环也是?

不完全......如果您只是将其作为循环中的额外行添加,您将覆盖之前的替换。 这样做:

$unsafeWords = array('content-type','bcc','cc');
foreach ($_POST as $key => $input) {
    $_POST[$key] = str_ireplace($unsafeWords, "", filter_var($input, FILTER_SANITIZE_STRIPPED)) ;
}

答案 1 :(得分:1)

您正在尝试使用字符串值覆盖$_POST(这是一个数组)。正确的方法是:

foreach ($_POST as &$input) {
    $input = str_ireplace($unsafeWords, array(), $input) ;
}

上面的代码还利用了一些其他功能(foreach,引用为循环变量,str_ireplace接受数组)要短得多。

答案 2 :(得分:1)

不完全清楚你在问什么,但是:

 $_POST = str_ireplace($value, "", $input) ;
绝对不会做你所期望的。你可能想要:

 $_POST[$key] = str_ireplace($value, "", $input) ;

答案 3 :(得分:0)

尝试这样做(在作业中缺少$ key)

$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
    foreach ($unsafeWords as $value) {
        $_POST[$key] = str_ireplace($value, "", $input) ;
    }
}

答案 4 :(得分:0)

除了foreach问题的形式,在邮件注入保护方面似乎非常不足验证。

对于电子邮件字段,我会使用一些基于regexp或filter_var()的解决方案。 对于名称和主题字段,我建议根据RFC规则对其进行编码。

所以,我认为安全代码可能是(如果是utf-8编码的电子邮件):

if ($email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
  $subject = "=?UTF-8?B?".base64_encode($_POST['subject'])."?=";
  $from    = "From: =?UTF-8?B?".base64_encode($_POST['name'])."?= <$email>\r\n";
  $message = str_replace("\n.", "\n .", $_POST['text']);
  mail('me@example.com',$subject,$message,$from);
}

答案 5 :(得分:-1)

如果要从$ unsafeWords中指定的$ _POST数组中删除索引,则继续使用错误的方法。使用unset()函数删除您不想要的索引或只是将其设置为

foreach($_POST as $key => $input)
{
    if(in_array($input, $unsafeWords)
    {
        $_POST[$key] = null; // or $_POST[$key] = '' or unset($_POST[$key]
    }
}