我想使用foreach循環搜索$ _POST中的單詞,但它不起作用?幫助被預先解決。foreach循環不工作
$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
foreach ($unsafeWords as $value) {
$_POST = str_ireplace($value, "", $input) ;
}
}
我想使用foreach循環搜索$ _POST中的單詞,但它不起作用?幫助被預先解決。foreach循環不工作
$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
foreach ($unsafeWords as $value) {
$_POST = str_ireplace($value, "", $input) ;
}
}
不要用一個字符串覆蓋$ _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()
EDIT
使用$ unsafeWords數組作爲str_ireplace()的參數,而不是使用foreach()循環遍歷它併爲每個條目調用str_ireplace()的示例。
$unsafeWords = array('content-type','bcc','cc');
foreach ($_POST as $key => $input) {
$_POST[$key] = str_ireplace($unsafeWords, "", $input) ;
}
和你沒有用空格代替,你用一個空字符串替換(有效地消除從$ _POST瓦爾不安全的字符串)
EDIT 2
我想這也可以放在 foreach循環中嗎?
不完全...如果您只是將其作爲額外的行添加到循環中,您將覆蓋以前的替換項。 做得一樣:
$unsafeWords = array('content-type','bcc','cc');
foreach ($_POST as $key => $input) {
$_POST[$key] = str_ireplace($unsafeWords, "", filter_var($input, FILTER_SANITIZE_STRIPPED)) ;
}
「請注意,您不需要循環$ unsafeWords數組,但可以將其作爲數組直接傳遞給str_ireplace()」它將如何完成?我更改爲$ _POST [$ key],但它不正確! 'bcc'只能刪除'cc'和內容類型(我在我的問題中輸入了錯誤)仍然在數組中,而不是被空格替換!? – 2011-03-21 14:50:59
我想可以把它放在foreach循環中嗎? $ _POST [$ key] =(filter_var($ input,FILTER_SANITIZE_STRIPPED));我的表單足夠安全嗎?或者你有其他建議嗎?我需要修剪和更改htmlencodings嗎?謝謝! – 2011-03-21 15:49:27
@user仍然是多個「To:」標頭可以被注入。你的愚蠢的「不安全的詞」方法似乎完全不安全 – 2011-03-21 16:19:10
您試圖用字符串值覆蓋$_POST
(這是一個數組)。正確的方法是這樣的:
foreach ($_POST as &$input) {
$input = str_ireplace($unsafeWords, array(), $input) ;
}
上面的代碼還利用幾個其他特徵(foreach
與參考作爲循環變量,str_ireplace
接受陣列)要短得多。
'&'在$ input之前做了什麼? – 2011-03-21 14:53:09
它使$ input成爲一個引用,這使得對$ input的值進行任何更改都會改變$ _POST中的值。否則,您只需更改複製的值。 – 2011-03-21 14:54:33
試試這個(在分配缺少$鍵)
$unsafeWords = array('content-typ','bcc','cc');
foreach ($_POST as $key => $input) {
foreach ($unsafeWords as $value) {
$_POST[$key] = str_ireplace($value, "", $input) ;
}
}
你問並未十分明確,但這樣的:
$_POST = str_ireplace($value, "", $input) ;
肯定贏做你期望的事。你可能想:
$_POST[$key] = str_ireplace($value, "", $input) ;
如果你想從在$ unsafeWords指定的$ _POST數組中刪除索引,然後你去與錯誤的做法。使用未設置()函數來刪除不想要的索引或簡單地將它設置爲
foreach($_POST as $key => $input)
{
if(in_array($input, $unsafeWords)
{
$_POST[$key] = null; // or $_POST[$key] = '' or unset($_POST[$key]
}
}
我想要搜索單詞'content'type','bcc','cc',並在每個輸入的字符串中替換這些單詞。我不想刪除洞字符串或索引 – 2011-03-21 14:55:34
你最初做的是用空字符串替換當前條目。如果您花幾秒鐘的時間查看我提供的代碼,您會注意到我在註釋中放入的內容與您正在做的是相同的,除了$ _POST中的每個條目之外,我沒有通過$ unsafeWords循環。對代碼進行更改並不難,使其能夠按照自己的意願進行操作。 – Furicane 2011-03-21 14:59:09
除了形成的foreach問題,似乎郵件注入保護方面非常不足驗證。
對於電子郵件字段,我會使用一些基於正則表達式的或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('[email protected]',$subject,$message,$from);
}
什麼$ _ POST含? – fabrik 2011-03-21 14:26:55
你能解釋它不工作的方式嗎? – 2011-03-21 14:27:15
這是電子郵件發送腳本? – 2011-03-21 14:29:20