2014-04-08 123 views
1

當我檢查我的劇本的Acunetix用掃描儀vuln我看到這個XSS錯誤:PHP:腳本(XSS_in_URI.script)

This vulnerability affects /cms/search.php. 
Discovered by: Scripting (XSS_in_URI.script). 

Attack details 
URI was set to "onmouseover='prompt(961413)'bad="> 
The input is reflected inside a tag parameter between double quotes. 

search.php頁我要安全所有的用戶輸入這個:反XSS的(safeXSS名功能)

if (isset($_POST['search'])) { 
    $search = array_map ('safeXSS', $_POST); 
} 
else 
{ 
    $search = array_map ('rawurldecode', $_GET); 
    $search = array_map ('safeXSS', $search); 
} 

搜索表單輸入:

<input type="submit" name="search" class="submit" value="search" /> 

我不明白我的問題是什麼?!我該如何解決這個問題?

+0

你可以發佈參數來顯示警報嗎?通常這意味着你沒有引用標記,但是在猜測中,我會說你的「用戶名」輸入的輸入標記很差。例如,可能它缺少關閉值「關於value屬性,並且您看到引用的文本是後面的內容,但是我看不到您顯示的輸入有問題,您確定是關於該輸入的? – sandino

回答

2

在你的PHP模板的地方,你將有類似的代碼:

<a href="<?php echo $uri ?>"> 

或:

echo "<a href=\"$uri\">"; 

HTML轉義是缺少在這裏,因此,如果一個引號字符包含在$uri值那麼URI內容會轉義其應該包含的屬性值,並且會得到危險的輸出:

<a href=""onmouseover='prompt(961413)'bad=">"> 

你應該調用每個每次htmlspecalchars()和解決這個問題,你輸出一個純文本字符串轉換成HTML文本內容或屬性值:

<a href="<?php echo htmlspecialchars($uri, ENT_QUOTES 'utf-8') ?>"> 

(你可以讓這個不那麼突兀通過定義像h()短命名的功能那爲你打電話echo htmlspecialchars。或者,從長遠來看,更喜歡使用模板語言,它會自動爲您執行此操作。)

您在$_POST/$_GET上進行的篩選並不是很有效。目前還不清楚什麼safeXSS正在做什麼,我完全不知道rawurldecode是在那裏,但總的來說,不可能在輸入階段實現字符串轉義的正確處理。

使用輸入'sanitisation'來試圖對抗XSS是一種常見的反模式,應該避免。 (出於其他原因,您可能希望執行自定義輸入過濾,但這是處理注入/轉義問題的錯誤方法。)HTML注入,JavaScript注入,XML注入等是輸出階段的問題;輸入階段並不知道將要使用什麼上下文輸入,所以不能以正確的方式處理該輸出上下文的輸入。