2010-08-25 17 views
5

我目前正在從一個討厭的XSS攻擊中恢復過來,並且意識到我從來沒有清理過幾個表單上的輸入我的網站。我使用Notepad ++的Find In Files功能在我的所有PHP文件中搜索$_POST,並且獲得了近5000條結果。現在,我真的不想去手動添加strip_tags到這些結果中的每一個,但替換 - 所有都不會做到這一點......而且我對於正則表達式。

有什麼辦法可以讓這個有點乏味?

回答

2

,你可以把這個文件(如safe.php)

foreach ($_POST as $key => $value) { 
    $_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]); 
} 

然後把require_once("safe.php");在每一個每一個你的PHP文件(或所有已包含你的PHP文件的文件)
這是一個醜陋的黑客..但它可以節省您的時間。

+0

太棒了。這正是我所期待的。 – 2010-08-25 04:49:21

+0

當有表單字段名稱像'foo [bar]'或'foo []'這樣的PHP自動轉換爲數組時,這將無法保護XSS。 – Tgr 2010-08-25 05:50:36

+0

@Tgr:是的,這絕對會像你說的那樣失敗,但我認爲他有想法根據他的需要進行定製 – w00d 2010-08-25 06:42:05

6

嗯,我想array_walk_recursive會做的伎倆:

function custom_strip(&$val, $index) { 
    $val = strip_tags($val); 
} 
array_walk_recursive($_POST, 'custom_strip'); 
0

很簡單。把這個你的每一個文件的頂部或在被調用一開始,每次在一個共同的頭文件:

function mystriptag(&$item) 
{ 
    $item = strip_tags($item); 
} 

array_walk($_POST, mystriptag); 
+0

當表單字段中有'foo [bar]'這樣的名稱時,或PHP自動轉換爲數組的'foo []'。 – Tgr 2010-08-25 05:50:58

18

只需使用array_map()

$Clean = array_map('strip_tags', $_POST); 

或者,如果你想讓它回到$_POST變量:

$_POST = array_map('strip_tags', $_POST); 

這可能是一個更好的主意,雖然使用不同的變量,改變$_POST一切發生,$Clean在您的文件。

0

你可以只array_mapstrip_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:網址等。