我正在尝试使用foreach循环来搜索$ _POST中的单词,但它不起作用?帮助是预先确定的。
$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
foreach ($unsafeWords as $value) {
$_POST = str_ireplace($value, "", $input) ;
}
}
答案 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]
}
}