2017-07-27 159 views
0

說,我有與用戶輸入的一些信息和使用PHP和PHP代碼submited到服務器,我有說防止JavaScript注入

$data = $_POST['data']; 
// or 
$data = strip_tags(@$_POST['data']); 
  1. 我想知道strip_tags()就夠形式通過HTML表單停止JavaScript注入。如果不是如何可以防止這種情況。我已閱讀here

  2. 並且還說我在瀏覽器地址欄中輸入javascript:void(document.bgColor="blue"),這將整個站點背景顏色更改爲藍色。如何防止通過地址欄注入JavaScript。

謝謝。

+0

使用'filter_input()'和'filter_input_array()'函數通常是更好的方法。你應該完全避免使用超級全局變量'$ _GET'和'$ _POST'等, – Octopus

+0

即使是着名的網站也沒有那麼強大的保護。 Facebook有一個很好的保護,它仍然可以調用功能,取決於瀏覽器的c –

回答

1

這取決於你試圖得到哪個輸出。

在某些情況下,你要離開HTML標籤,包括script標籤,但你要,這些元素將無法運行,當你輸出它們,在這種情況下,你應該使用htmlspecialchars($_POST['data']),(它的建議來定義作爲第三個參數也是utf8)。

但是如果你想比strip_tags刪除entierly標籤將防止XSS

+0

非常感謝。你的回答有幫助。 – diagold

1

我建議使用htmlspecialchars當過你想要輸出的東西到瀏覽器

echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); 

結賬this

+0

非常感謝。你的回答有幫助。 – diagold

1

對於問題2,我不確定這是否可以預防。這不是我以前考慮過的事情。這聽起來像是你試圖阻止執行任何你沒有在頁面上包含的javascript,這也意味着阻止瀏覽器中的devtools執行控制檯中的任何東西。這可能會對您的用戶產生不利影響,例如如果他們想使用Instapaper的小書籤。

對於1,最終您的目標是避免在生成新頁面時將此注入的JavaScript從表單中包含。從表單輸出數據時,可以將其包裝在htmlspecialchars中。

+0

非常感謝。你的回答有幫助。 – diagold

1

一個函數不能完全保護您免於腳本注入。考慮下面的程序:

<?php 
if(isset($_POST['height'])) 
    $height=htmlspecialchars($_POST['height'], ENT_QUOTES, 'UTF-8'); 
else $height=200; 
if(isset($_POST['width'])) 
    $height=htmlspecialchars($_POST['width'], ENT_QUOTES, 'UTF-8'); 
else $width=300; 
echo(" 
<!DOCTYPE html> 
<html> 
<body> 
<iframe src='whatever' height=$height width=$width> 
</iframe> 
</body> 
</html> 
"); 

輸入被消毒,但JavaScript的還是會通過像一個簡單的注射向量執行:

300 onload=alert(String.fromCharCode(88)+String.fromCharCode(83)+String.fromCharCode(83)) 

你仍然需要引用您的屬性,或者你很容易受到這樣的例。

當用戶輸入回顯到JavaScript註釋中時,存在另一個半公共注入向量,您可以注入新行或關閉註釋。我把它歸咎於'這個狗屎不應該像它應該那樣工作,但是讓我們把它留在評論'式的發展中。

注意:許多瀏覽器的XSS保護將無法運行我的簡單示例。如果你想嘗試使用一個沒有保護,或找到一個嚮導來擊敗它(不知道是否有一個例如鉻)。