如何保护网站免受 xss(跨站点脚本)攻击
How to protect a website from xss (Cross site scripting)
好的,所以我学到了一些 PHP 并尝试制作一个简单的应用程序,但我不确定我的网页是否安全,免受 xss 和其他此类攻击。
我的PHP代码
<?php
$title=$keywords=$description="";
$valid_er="";
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($_POST['title'])){
$valid_er="has-error";
}
else{
$title="<title>".test($_POST["title"])."<title>";
}
$keywords='<meta name="keywords" content="'.test($_POST["keywords"]).'" />';
$description='<meta name="description" content="'.test($_POST['description']).'" />';
}
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()
会保护我的。
I just wanted to know am i vulnerable to cross site scripting
不,你不是,在大多数情况下,仅使用 htmlspecialchars
就可以保护你免受 XSS 攻击(如果你在属性周围使用双引号并遵循我最后一段中的规则)。
不需要使用stripcslashes
,也不需要自己编码<
等
但请注意,默认情况下 htmlspecialchars
不会对单引号 ('
) 进行编码。我提到这一点是因为对于您的 form
标记,您主要使用单引号,而对于操作只使用双引号,这是一个非常好的主意,否则您的代码将容易受到 XSS 攻击。为避免此问题,您可以使用 htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
,单引号也将被编码。你仍然不能省略任何引号(如果你这样做,防止 XSS 变得更加复杂,因为你需要转义所有你可以打破该上下文的字符,包括 space, +
, 等), 但是有了这个, 你可以使用双引号或单引号并且安全。
有关更多信息,请查看有关 XSS prevention 的网站(它会告诉您这种编码的不足之处;您永远不应将用户输入放在 <script>
、<style>
中, HTML 注释、属性名称或标签名称)。
好的,所以我学到了一些 PHP 并尝试制作一个简单的应用程序,但我不确定我的网页是否安全,免受 xss 和其他此类攻击。
我的PHP代码
<?php
$title=$keywords=$description="";
$valid_er="";
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($_POST['title'])){
$valid_er="has-error";
}
else{
$title="<title>".test($_POST["title"])."<title>";
}
$keywords='<meta name="keywords" content="'.test($_POST["keywords"]).'" />';
$description='<meta name="description" content="'.test($_POST['description']).'" />';
}
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()
会保护我的。
I just wanted to know am i vulnerable to cross site scripting
不,你不是,在大多数情况下,仅使用 htmlspecialchars
就可以保护你免受 XSS 攻击(如果你在属性周围使用双引号并遵循我最后一段中的规则)。
不需要使用stripcslashes
,也不需要自己编码<
等
但请注意,默认情况下 htmlspecialchars
不会对单引号 ('
) 进行编码。我提到这一点是因为对于您的 form
标记,您主要使用单引号,而对于操作只使用双引号,这是一个非常好的主意,否则您的代码将容易受到 XSS 攻击。为避免此问题,您可以使用 htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
,单引号也将被编码。你仍然不能省略任何引号(如果你这样做,防止 XSS 变得更加复杂,因为你需要转义所有你可以打破该上下文的字符,包括 space, +
, 等), 但是有了这个, 你可以使用双引号或单引号并且安全。
有关更多信息,请查看有关 XSS prevention 的网站(它会告诉您这种编码的不足之处;您永远不应将用户输入放在 <script>
、<style>
中, HTML 注释、属性名称或标签名称)。