2015-04-12 148 views
0

好吧,所以我已經學會了一點PHP,並嘗試做一個簡單的應用程序,但我不知道是我的網頁安全從xss和其他此類攻擊。如何保護網站免受xss(跨網站腳本)

我的PHP代碼

<?php 
$title=$keywords=$description=""; 
$valid_er=""; 


if($_SERVER["REQUEST_METHOD"] == "POST"){ 

if(empty($_POST['title'])){ 

$valid_er="has-error"; 
} 

else{ 
$title="&lt;title&gt;".test($_POST["title"])."&lt;title&gt;"; 
} 


$keywords='&lt;meta name="keywords" content="'.test($_POST["keywords"]).'" /&gt;'; 
$description='&lt;meta name="description" content="'.test($_POST['description']).'" /&gt;'; 

} 

function test($ci){ 

$ci=htmlentities($ci); 
$ci=stripcslashes($ci); 
return $ci; 
} 


?> 

和我的HTML表單

<form method='post' class='form-group' action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
<label> Your Title </label> <input placeholder="Your websites title" type="text" name="title" class='form-control' class='form-group-item'/></br> 
<label> Keywords </label> <input placeholder="Your keywords separated by comma " type="text" name="keywords" class='form-control' class='form-group-item'/></br> 
<label>Description </label> <textarea placeholder="A nice description about your website;" name="description" class='form-control'></textarea></br> 
<input type="submit" class='btn btn-info'> 

    </form> 

我只是想知道我是不是容易受到跨站點腳本,因爲我不認爲只有使用

htmlspecialchars()

會保護我。

+0

請參閱http://stackoverflow.com/questions/1996122/how-to-prevent-xss-with-html-php – christophetd

+0

如果你能告訴我是我的代碼安全,這將是非常有益的 –

+0

你不需要使用stripcslashes來轉義HTML。 htmlspecialchars就夠了。此外,當您在PHP代碼中編寫HTML時,不應使用轉義字符,如'<',因爲它們將被打印在瀏覽器中而不是被解釋。基本上:當你寫HTML的時候,一般寫下來;當您顯示來自用戶輸入的內容時,請使用htmlspecialchars。這有幫助嗎? – christophetd

回答

1

我只是想知道我是不是容易受到跨站點腳本

不,你沒有,只是用htmlspecialchars將保護您免受XSS在大多數情況下(如果你用身邊的屬性雙引號並遵守我最後一段的規定)。

你並不需要使用stripcslashes,並且不需要進行編碼自己<

做然而要注意htmlspecialchars不編碼默認情況下,一個單引號(')。我提到這個是因爲對於你的form標籤,你主要使用單引號,並且只需雙引號,這是一個非常好的主意,否則你的代碼就容易受到XSS的攻擊。爲了避免這個問題,你可以使用htmlspecialchars($string, ENT_QUOTES, 'UTF-8');,同時單引號也會被編碼。你仍然不能忽略使用任何引號(如果你這樣做,防止XSS變得更加複雜,因爲你需要轉義所有可以跳出該上下文的字符,其中包括空格,+等) ,但有了這個,你可以使用雙引號或單引號並且安全。

欲瞭解更多信息,看看這個網站關於XSS prevention(它會告訴您這種編碼是不夠的,你永遠不應該把用戶輸入的內部<script><style>,HTML註釋,屬性名稱或標籤名稱)。

+0

感謝您的幫助,我一定會實施您的所有提示。 –

+1

爲什麼'htmlentities'推薦超過'htmlspecialchars'? 'htmlspecialchars' * *默認情況下會替換雙引號''',這是單引號''',不會被默認取代。 – Gumbo

+0

@Gumbo謝謝你,你當然對引號適合。我收回了我對'htmlentities'的評論,它沒有提供任何'htmlspecialchars'沒有提供的(關於XSS)。 – tim