2015-04-12 146 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