我目前正在從一個討厭的XSS攻擊中恢復過來,並且意識到我從來沒有清理過幾個表單上的輸入我的網站。我使用Notepad ++的Find In Files功能在我的所有PHP文件中搜索$_POST
,並且獲得了近5000條結果。現在,我真的不想去手動添加strip_tags
到這些結果中的每一個,但替換 - 所有都不會做到這一點......而且我對於正則表達式。
有什麼辦法可以讓這個有點乏味?
我目前正在從一個討厭的XSS攻擊中恢復過來,並且意識到我從來沒有清理過幾個表單上的輸入我的網站。我使用Notepad ++的Find In Files功能在我的所有PHP文件中搜索$_POST
,並且獲得了近5000條結果。現在,我真的不想去手動添加strip_tags
到這些結果中的每一個,但替換 - 所有都不會做到這一點......而且我對於正則表達式。
有什麼辦法可以讓這個有點乏味?
,你可以把這個文件(如safe.php)
foreach ($_POST as $key => $value) {
$_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]);
}
然後把require_once("safe.php");
在每一個每一個你的PHP文件(或所有已包含你的PHP文件的文件)
這是一個醜陋的黑客..但它可以節省您的時間。
嗯,我想array_walk_recursive
會做的伎倆:
function custom_strip(&$val, $index) {
$val = strip_tags($val);
}
array_walk_recursive($_POST, 'custom_strip');
很簡單。把這個你的每一個文件的頂部或在被調用一開始,每次在一個共同的頭文件:
function mystriptag(&$item)
{
$item = strip_tags($item);
}
array_walk($_POST, mystriptag);
當表單字段中有'foo [bar]'這樣的名稱時,或PHP自動轉換爲數組的'foo []'。 – Tgr 2010-08-25 05:50:58
只需使用array_map()
。
$Clean = array_map('strip_tags', $_POST);
或者,如果你想讓它回到$_POST
變量:
$_POST = array_map('strip_tags', $_POST);
這可能是一個更好的主意,雖然使用不同的變量,改變$_POST
一切發生,$Clean
在您的文件。
你可以只array_map
strip_tags
到$_POST
,但它是好得多寫一個自定義函數從它獲得的數據:
function post_data($name) {
global $post_cache;
if (in_array($name, $post_cache)) {
return $post_cache[$name];
}
$val = $_POST[$name];
if (is_string($val)) {
$val = strip_tags($val);
} else if (is_array($val)) {
$val = array_map('strip_tags', $val);
}
$post_cache[$name] = $val;
return $val;
}
這會讓你的代碼更易讀(別人尋找到它通常會假設$_POST['foo']
是表單字段foo
中的數據,而不是你已經預處理的東西),不會導致你直接嘗試訪問$ _POST的插件或庫的問題,使得易於向$_POST
預處理添加更多邏輯(當需要magic quotes時被啓用是常見的),而沒有捕捉所有的地方在你使用POST數據的代碼中,當你意識到有幾個POST字段需要使用HTML標籤時,可以避免巨大的麻煩。一般來說,直接改變任何超全球植物是一個非常糟糕的主意。
另外,最好在輸出上清理數據,而不是輸入。不同的用途需要不同的方法,例如,如果你使用
<div class="user_photo">
<img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>
然後$user_name
是XSS攻擊向量,strip_tags
不利於反對它在所有;您需要htmlspecialchars。如果將用戶數據用作URL,則需要另一種方法來抵禦javascript:
網址等。
太棒了。這正是我所期待的。 – 2010-08-25 04:49:21
當有表單字段名稱像'foo [bar]'或'foo []'這樣的PHP自動轉換爲數組時,這將無法保護XSS。 – Tgr 2010-08-25 05:50:36
@Tgr:是的,這絕對會像你說的那樣失敗,但我認爲他有想法根據他的需要進行定製 – w00d 2010-08-25 06:42:05