关于前端的网络攻击,有以下两种是最为常见的
Cross-site scripting:跨站脚本攻击
跨站请求伪造(CSRF)
下面分别介绍两种攻击方式
跨站脚本攻击是一种安全漏洞
,攻击者可以利用漏洞,向网站注入恶意的客户端代码
。
如果受害者在没有察觉中运行
这些恶意代码,攻击者就可以突破网站的访问限制
,以受害者身份,去操作网站上任何可执行的操作
,或者读取受害者在目标网站上的个人信息
、cookie、session tokens 等网站验证信息。
XSS 攻击有三种类型,分别如下:
存储型XSS,攻击者提交了带有恶意脚本
的内容到服务器,这个内容保存到数据库
。当其他用户访问这个网站后,内容被这些用户获取,恶意代码便可以在这些用户客户端运行
,发起攻击。
反射型也称为“非持久型XSS
” ,它需要靠被攻击者服务器,将用户输入的数据反射
回来给浏览器。
攻击者会构造
一个包含恶意脚本的URL
,并将此URL 发送给用户。当用户点击打开这个URL 时,服务器会将有恶意代码的内容返回到浏览器并运行
,达到攻击目标。
这种方式不将恶意脚本存储在被攻击的服务器
,而是拼接在URL中,并最后随着操作结果返回到受害者浏览器。通过欺骗浏览器信任此恶意脚本
,执行窃取个人身份信息如cookie 等发送到攻击者的服务器
。
举例来说,如果一个用户在登录某个Web应用程序后获得了一个cookie,攻击者可以将含有恶意代码的URL发送给用户。
当用户打开这个URL时,Web服务器会执行该URL中的请求,并将恶意代码以请求结果返回给用户浏览器,浏览器执行URL中包含的JavaScript代码。这样,攻击者就可以利用这段恶意代码将用户的cookie信息发送到他们控制的服务器上,进而实现非法登录等恶意行为。
下面的地址中,欢迎XXX 是根据URL 的参数name 的值来确定的,是一个动态内容。当我们改变name的值的时候,HTML 显示的值也会变成name对的值。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function() //这里是显示一条指定消息和一个确认按钮的警告框
{
confirm("完成的不错!");//指定消息完成得不错!
window.location.href="level2.php?keyword=test"; //刷新当前页面,并且重定向到level2
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:4</h3></body>
上面代码中,我把URL 地址改成https://xssaq.com/yx/level1.php?name=<script>alert()</script>
就是执行alert()
函数,实现攻击目标。因为后端没有过滤掉这些恶意代码,直接将这些动态内容传给前端,便会把当做普通函数执行。
效果如图所示,成功执行了alert 函数。
下面的两种情况,容易发生XSS攻击:
DOM型攻击,是将恶意脚本注入到被攻击的应用程序的DOM 结构中,而不需要存储到被攻击者服务器,通过修改原DOM 而达到攻击目的。
跨站伪造请求,Cross-site request forgery,也称为 XSRF,是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。
例如,这些非预期的请求,可能是通过URL 链接加入恶意参数来达到攻击目标,如下面的图片的src参数
<img src="https://www.example.com/index.php?action=delete&id=123" />
对于https://www.example.com
有权限的用户来说,这个标签会在他们不注意的时候下对https://www.example.com/index.php
服务器发送请求,来达到攻击者的目的。
这个图片可能不在https://www.example.com站内,因为用户登录了https://www.example.com后,会保留一些个人信息,攻击者可能通过诱导受害者进入有恶意链接图片
,从而执行https://www.example.com/index.php?action=delete&id=123
请求,并携带了用户在https://www.example.com
的登录信息,造成服务器以为是受害者自己发起的,从而伪造
了受害者的请求。
根据XSS 攻击的发生原因,和类型,我们可以可以采取以下的防御措施
对所有用户的输入的数据进行严格的过滤、移除或转义可能导致脚本执行的字符或字符串,例如特殊字符“>” 、“<”、“&” 等
将敏感信息(会话标志)存储在HttpOnly 的Cookie 中,这样,即使有恶意脚本,也无法直接执行获取Cookie 的操作。
CSP 可以限制浏览器只加载和执行特定来源的脚本
,从而防止恶意脚本的执行
根据用户的角色和权限,限制他们可以访问和操作的资源,从而降低XSS攻击的影响范围。
对于CSRF,我们需要加强请求的验证,可以采取以下的方案
检查HTTP请求头中的Referer
字段,确保请求是从合法的源发起的
。这样就避免受害者从其他被攻击者诱导进入的网站中
,无疑发起非预期的请求。因为 Referer 字段会记录发起请求来源于哪个URL地址
,如果这个Referer 字段与自己的网站不一致,基本可以判断为第三方不被信任。
在表单中添加一个随机生成的令牌
,服务器验证该令牌以确保请求是合法的。
在敏感操作中使用验证码,以防止自动化攻击。