【问题标题】:How to protect a website from xss (Cross site scripting)如何保护网站免受 xss(跨站点脚本)
【发布时间】:2015-04-12 12:09:18
【问题描述】:

好的,所以我已经学习了一点 PHP,并尝试制作一个简单的应用程序,但我不确定我的网页是否安全免受 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()

会保护我。

【问题讨论】:

  • 如果你能告诉我我的代码是安全的,那真的很有帮助
  • 您不需要使用 stripcslashes 来转义 HTML。 htmlspecialchars 就足够了。此外,当您在 PHP 代码中编写 HTML 时,不应使用转义字符,例如 &amp;lt;,因为它们将在浏览器中打印而不是被解释。基本上:当你写HTML时,正常写;当您显示来自用户输入的内容时,请使用 htmlspecialchars。这有帮助吗?
  • 实际上我之前为添加 name 的值制作了相同的代码,因此由于 name 不包含斜杠,我做了所有这些,但我使用了相同的代码。我正在使用 <因为我想显示 "

标签: php mysql security xss protection


【解决方案1】:

我只是想知道我是否容易受到跨站点脚本的攻击

不,你不是,在大多数情况下,使用 htmlspecialchars 可以保护你免受 XSS 攻击(如果你在属性周围使用双引号并遵循我上一段中的规则)。

不需要使用stripcslashes,也不需要自己编码&lt;

但请注意,htmlspecialchars 默认情况下不编码单引号 (')。我提到这一点是因为对于您的 form 标记,您主要使用单引号,并且只使用双引号作为操作,这是一个非常好的主意,否则您的代码将容易受到 XSS 攻击。为避免此问题,您可以使用htmlspecialchars($string, ENT_QUOTES, 'UTF-8');,单引号也将被编码。您仍然不能只省略使用任何引号(如果这样做,防止 XSS 变得更加复杂,因为您需要转义所有可以打破该上下文的字符,包括空格,+,等),但是有了这个,您可以使用双引号或单引号并且安全。

有关更多信息,请查看有关 XSS prevention 的网站(它会告诉您这种编码在哪里不够;您不应该将用户输入放在 &lt;script&gt;&lt;style&gt;、HTML cmets、属性名称或标签名称)。

【讨论】:

  • 感谢您的帮助,我一定会实施您的所有建议。
  • 为什么推荐 htmlentities 而不是 htmlspecialchars?而htmlspecialchars确实默认替换双引号",默认不替换的是单引号'
  • @Gumbo 谢谢,你当然是对的报价。我收回我对htmlentities 所说的话,它没有提供htmlspecialchars 没有提供的任何东西(关于XSS)。
最近更新 更多