CSRF (Cross Site Request Forgery) 跨站请求伪造
CSRF 攻击只是借用了 Cookie,并不能获取 Cookie 中的信息,所以不能获取 Cookie 中的 token,也就不能在发送请求时在 POST 或者 GET 中设置 token,把请求发送到服务器端时,token 验证不通过,也就不会处理请求了。
案例演示:
用户登录http://127.0.0.1:9000的网站,输入用户名密码登录某网站后,服务端把记录用户登录的cookie保存到浏览器中,此时用户登录的状态为已登录
此后该网站域名下每次接口请求都会携带cookie(接口收到请求后认为用户已登录)
此时用户调用接口实现转账:
当用户操作完转账后,并没有及时退出登录(cookie中依旧有用户登录的状态),
这时候有一个钓鱼网站诱导用户访问:该钓鱼网站有一张图片(更高明地,宽高都为0,此时用户压根都看不到),图片的src 路径为转账接口地址,
当钓鱼网站加载时,相当于调用了一次转账接口:(由于该域名下cookie为已登录,请求时带上了该cookie传给了服务端,转账接口调用成功!)
如果是 POST 提交表单,可以这样做:
用户的身份识别就是利用cookie,那么冒充用户身份的方式即利用访问一个域名下其他页面请求,浏览器会携带当前域下的cookie这一特性。
防御思路:
1. 区分请求来自于自己的前端页面还是第三方网站
2. 让自己的前端页面请求和第三方伪造请求有所不同
解决方案:
-
尽量使用POST,限制GET
GET
接口太容易被拿来做 CSRF
攻击,看上面示例就知道,只要构造一个 img
标签,而 img
标签又是不能过滤的数据。接口最好限制为 POST
使用, GET
则无效,降低攻击风险。
当然 POST
并不是万无一失,攻击者只要构造一个 form
就可以,但需要在第三方页面做,这样就增加暴露的可能性。
-
将 cookie设置为 HttpOnly
CRSF
攻击很大程度上是利用了浏览器的 cookie
,为了防止站内的 XSS
漏洞盗取 cookie
,需要在 cookie
中设置 “HttpOnly”
属性,这样通过程序(如 JavaScript
脚本、 Applet
等)就无法读取到 cookie
信息,避免了攻击者伪造 cookie
的情况出现。
在 Java
的 Servlet
的API中设置 cookie
为 HttpOnly
的代码为:response.setHeader("Set-Cookie","cookiename=cookievalue;HttpOnly");
-
增加Token
CSRF
攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于 cookie
中,因此攻击者可以在不知道用户验证信息的情况下直接利用用户的 cookie
来通过安全验证。由此可知,抵御 CSRF
攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信总不存在于 cookie
之中。鉴于此,系统开发人员可以在 HTTP
请求中以参数的形式加入一个随机产生的 token
,并在服务端进行 token
校验,如果请求中没有 token
或者 token
内容不正确,则认为是 CSRF
攻击而拒绝该请求。
-
通过Referer识别
根据 HTTP
协议,在 HTTP
头中有一个字段叫 Referer
,它记录了该 HTTP
请求的来源地址。在通常情况下,访问一个安全受限的页面的请求都来自于同一个网站。比如某银行的转账是通过用户访问 http://www.xxx.com/transfer.do
页面完成的,用户必须先登录 www.xxx.com
,然后通过单击页面上的提交按钮来触发转账事件。当用户提交请求时,该转账请求的 Referer
值就会是 提交按钮所在页面的 URL
。
如果攻击者要对银行网站实施 CSRF
攻击,他只能在其他网站构造请求,当用户通过其他网站发送请求到银行时,该请求的 Referer
的值是其他网站的地址,而不是银行转账页面的地址。因此,要防御 CSRF
攻击,银行网站只需要对于每一个转账请求验证其 Referer
值即可,如果是以 www.xx.om
域名开头的地址,则说明该请求是来自银行网站自己的请求,是合法的;如果 Referer
是其他网站,就有可能是 CSRF
攻击,则拒绝该请求。
XSS (Cross-Site Scripting)跨站脚本攻击
利用 xss,黑客可以伪造用户登录,从而冒充用户身份、刷点击、弹广告、传播蠕虫病毒等等。按照类型可分为反射型和存储型。
反射型 XSS:
存储型 XSS:
案例演示:
用户在浏览器输入信息:
服务端以html 形式返回输入的部分内容:
如果注入 script 标签:
提交成功后,服务端依旧返回 script 标签,此时构成 XSS 攻击:
解决方案:
1. WAF 规则库码 (Web Application Firewall , Web 应用防火墙,可防范 SQL 注入,XSS等)
原文链接:https://blog.csdn.net/edwardwzw/article/details/122297261?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166549223916800182112297%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166549223916800182112297&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-23-122297261-null-null.nonecase&utm_term=%E7%A7%91%E6%99%AE
请登录后查看评论内容