Php foreach循环不工作

Php foreach循环不工作,php,Php,我试图使用foreach循环在$\u POST中搜索单词,但它不起作用?帮助是宝贵的 $unsafeWords = array('content-typ','bcc','cc'); foreach ($_POST as $key => $input) { foreach ($unsafeWords as $value) { $_POST = str_ireplace($value, "", $input) ; } } 您正试图用字符串值覆盖$\u POST

我试图使用foreach循环在$\u POST中搜索单词,但它不起作用?帮助是宝贵的

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

您正试图用字符串值覆盖
$\u POST
(这是一个数组)。正确的方法是:

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

上述代码还利用了两个其他功能(引用作为循环变量的foreach,
str\u ireplace
接受数组)更短。

您试图用字符串值覆盖
$\u POST
(这是一个数组)。正确的方法是:

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

上面的代码还利用了一些其他特性(
foreach
带有一个引用作为循环变量,
stru-ireplace
接受数组)更短。

不要用字符串覆盖$\u-POST数组

$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
    foreach ($unsafeWords as $value) {
        $_POST[$key] = str_ireplace($value, "", $input) ;
    }
}
虽然我不喜欢覆盖原始的$\u 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) ;
}
而不是用空格替换,而是用空字符串替换(有效地从$\u POST vars中删除不安全的字符串)

编辑2


我想把这个放在盒子里没关系 也是foreach循环

不完全是。。。如果只是将其作为循环中的一个额外行添加,则会覆盖以前的替换。 按如下方式操作:

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

不要用字符串覆盖$\u POST数组

$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
    foreach ($unsafeWords as $value) {
        $_POST[$key] = str_ireplace($value, "", $input) ;
    }
}
虽然我不喜欢覆盖原始的$\u 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) ;
}
而不是用空格替换,而是用空字符串替换(有效地从$\u POST vars中删除不安全的字符串)

编辑2


我想把这个放在盒子里没关系 也是foreach循环

不完全是。。。如果只是将其作为循环中的一个额外行添加,则会覆盖以前的替换。 按如下方式操作:

$unsafeWords = array('content-type','bcc','cc');
foreach ($_POST as $key => $input) {
    $_POST[$key] = str_ireplace($unsafeWords, "", filter_var($input, FILTER_SANITIZE_STRIPPED)) ;
}
改为尝试此操作(分配中缺少$key)

改为尝试此操作(分配中缺少$key)


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

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

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

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

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

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

如果要从$unsafeWords中指定的$\u POST数组中删除索引,则使用了错误的方法。使用unset()函数删除您不需要的索引,或将其设置为

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

如果要从$unsafeWords中指定的$\u POST数组中删除索引,则使用了错误的方法。使用unset()函数删除您不需要的索引,或将其设置为

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

除了每个问题之外,就邮件注入保护而言,验证似乎非常不足

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

因此,我相信安全代码可以是(在utf-8编码电子邮件的情况下):

if($email=filter\u var($\u POST['email'],filter\u VALIDATE\u email)){
$subject=“=?UTF-8?B?”。base64_编码($_POST['subject'])。“?=”;
$from=“from:=?UTF-8?B?”.base64_编码($\u POST['name'])。“?=\r\n”;
$message=str_replace(“\n.”、“\n.”、$_POST['text']);
邮件('me@example.com“,$subject,$message,$from);
}

除了每个问题之外,邮件注入保护方面的验证似乎非常不足

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

因此,我相信安全代码可以是(在utf-8编码电子邮件的情况下):

if($email=filter\u var($\u POST['email'],filter\u VALIDATE\u email)){
$subject=“=?UTF-8?B?”。base64_编码($_POST['subject'])。“?=”;
$from=“from:=?UTF-8?B?”.base64_编码($\u POST['name'])。“?=\r\n”;
$message=str_replace(“\n.”、“\n.”、$_POST['text']);
邮件('me@example.com“,$subject,$message,$from);
}

您能解释一下它以什么方式不起作用吗?这是用于发送电子邮件的脚本吗?$\u POST的内容来自一个带有“名称”、“电子邮件”和“消息”等字段的表单,我想在发送之前检查一下。它是否足够安全,只需像我这样搜索“电子邮件”输入或所有输入?你能解释一下它以何种方式不起作用吗?这是用于电子邮件发送脚本吗?$\u POST的内容来自一个带有“名称”、“电子邮件”和“消息”等字段的表单,我想在发送之前检查它。只搜索“email”中的输入或像我这样搜索所有输入是否足够安全?“请注意,您不需要循环$unsafeWords数组,但可以将它作为数组直接传递给str_ireplace()”如何完成?我改为$\u POST[$key],但它不能正常工作“密件抄送”仅删除仍在数组中的“抄送”和内容类型(我在“我的问题”中键入的错误),而不替换为空格!?我想把它也放在foreach循环中也没关系吧$_POST[$key]=(filter_var($input,filter_SANITIZE_));我的表格足够安全吗?或者你还有其他建议吗?我需要修剪和更改htmlencodings吗?谢谢@用户仍然可以注入多个“To:”标题。你愚蠢的“不安全的话”方法似乎完全不安全“注意,你不需要循环