「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
XSS攻击
xss攻击(全称cross-site scripting)跨站脚本攻击,是指在浏览器中插入一段恶意的脚本,从而窃取信息或者模仿你本人进行操作。
xss攻击分为三种类型:反射型xss、基于dom的xss及持久型xss。
反射型xss
反射型xss通常出现在前后端一体的网页中,提交给服务端的数据立即用于结果的展示,就容易受到攻击。 比如下面这段代码:
<!DOCTYPE html><html>
<body>
<form role="search" action="" method="GET">
<input type="text" name="search" placeholder="请输入要搜索的内容">
<button type="submit">搜索</button>
</form>
<?php
if (isset($_GET['search']) && !empty($_GET['search'])) {
$search = $_GET['search'];
echo "<h3>你搜索的结果内容是:" . $search . "</h3>";
}
?>
</body>
</html>
页面会从query里取数据展示到html里 如果攻击者构建一个链接:http://localhost/index.php?search=<%2Fh3>
基于DOM的xss
在前后端分离的页面里,前端页面与后端服务隔离,但是如果处理不当,把外部输入内容直接插入到dom中,依然有xss的风险。 如下面这段代码:
<!DOCTYPE html>
<html>
<body>
<form role="search" action="" method="GET"> <input type="text" name="search" placeholder="请输入要搜索的内容"> <button
type="submit">搜索</button> </form>
<script>
var search = location.search.substring(8); document.write('你搜索的结果内容是:' + decodeURIComponent(search));
</script>
</body>
</html>
直接把query里的内容塞入到dom中,导致了和上面反射型xss一样的结果。 所以说,不要随便点一些乱七八糟的链接。
持久型xss
以上两种攻击类型因为攻击内容没有存到后端服务,所以只有打开链接的用户受到影响,危害有限。持久型xss就是攻击内容存到了后端服务中,所以展示相应内容的用户都会收到攻击。 如:用户提交评论, 服务端将这条评论直接存到了服务器,并展示给其它用户,那么所有访问到这个评论的用户都会收到攻击。
如何应对xss攻击
验证输入/输出,一切用户输入都不可信,可以采用白名单的方式对用户的输入进行验证。如输入手机号只让输入数字。 且在需要展示的时候对内容进行验证。通常来说,前端框架在展示端都有对进行处理及过滤,按框架推荐规范去展示数据能很大程度规避问题,如尽量不用v-html等危险的语法。 W3C 提出了 CSP(Content Security Policy,内容安全策略)来提升 Web 的安全性。所谓 CSP,就是在服务端返回的 HTTP header 里面添加一个 Content-Security-Policy 选项,然后定义资源的白名单域名。浏览器就会识别这个字段,并限制对非白名单资源的访问。这个策略之所以有效,是因为直接攻击内容(url或者评论内容)长度有限,通常会加载三方js代码去执行实际的攻击逻辑。