CSRF攻击原理解析

CSRF的英文全称是Cross Site Request Forgery,字面上的意思是跨站点伪造请求

 

浏览器的安全缺陷:

来自与页面相同domain的文件请求都会带cookie,包括图片,音乐,flash,iframe

 

浏览器cookie缺陷:

1。内存cookie,ie允许跨域访问

2。网站设置 P3P头,ie允许跨域访问cookie

3。firefox没有限制

 

 

CSRF攻击分类 :

 

站内:滥用$_REQUEST , 利用$_GET参数提交表单。(网站对本站cookie登陆的信任)

 

站外:在站外web页面写js脚本伪造文件请求或者表单提交。(利用网站对跨域cookie的信任)

 

只要用户浏览这样页面,就会强迫发起请求

 

利用被攻击站点对用户登陆的信任,在用户不知情的情况下,发表一些内容

 

 

### CSRF攻击机制 CSRF(跨站点请求伪造)是一种网络攻击手段,在此类攻击中,攻击者利用受害者在受信任网站上的认证状态执行非授权指令。具体而言,当用户访问了一个由攻击者控制的网页(Web B),该网页可能包含一段脚本或链接指向另一个用户已经登录的服务(Web A)并触发特定的操作。由于浏览器会自动附带用户的Cookie和其他认证信息给目标服务器,因此即使用户并未主动交互,也能成功提交表单或者发出HTTP请求[^4]。 对于Web应用程序来说,如果缺乏足够的防护措施,则任何能够预测URL及其参数结构的功能都可能成为潜在风险点。例如修改密码、转账汇款等功能接口如果没有额外验证就很容易被滥用。 ### 防御措施 #### 服务端防御策略 1. **引入一次性Token** 实现最广泛的方法之一是在每次敏感操作前生成独一无二的一次性令牌(即CSRF Token),并将此令牌嵌入到HTML页面中的隐藏字段里或是作为自定义头部传递给前端应用。当接收到POST/PUT/PATCH等类型的请求时,服务器需校验随同数据一同传来的token是否匹配当前会话记录下的预期值;如果不一致则拒绝处理此次调用[^3]。 2. **双重Cookie模式** 另一种常见的做法是通过设定专门用于保护API免遭CSRF侵害的cookie属性——HttpOnly=false,并要求客户端在发起涉及重要变更的动作之前先获取一个临时性的anti-CSRF token。这种方式依赖于JavaScript读取存储于document.cookie内的特殊标记并与之一起发送至后台进行对比分析[^2]。 3. **SameSite Cookie 属性配置** 设置`Set-Cookie`响应头里的`samesite=strict|lax;`选项可以有效地阻止第三方域名下的资源加载过程中携带有的session标识符。这使得即便有恶意站点尝试诱导用户点击含有危险命令的超链接也无法绕过这项限制条件完成整个流程[^1]。 #### 客户端建议 虽然主要防范工作集中在后端实现层面,但仍有一些最佳实践可供开发者参考以便进一步增强安全性: - 推荐安装具备实时监控功能的安全插件来拦截可疑行为并向用户提供警告通知。 ```python from flask import Flask, request, session, redirect, url_for import uuid app = Flask(__name__) app.secret_key = 'supersecretkey' @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': user_id = authenticate_user(request.form['username'], request.form['password']) # 假设这里有一个函数去验证用户名和密码 if user_id is not None: session['user'] = str(user_id) session['csrf_token'] = str(uuid.uuid4()) return redirect(url_for('index')) return ''' <form method="post"> Username:<br> <input type="text" name="username"><br> Password:<br> <input type="password" name="password"><br><br> <input type="submit" value="Login"> </form>''' @app.route('/') def index(): csrf_token = session.get('csrf_token') html_content = f''' Welcome! Here you can perform actions that require protection against CSRF attacks. <!-- Hidden input field containing the anti-forgery token --> <form action="/do_something_important" method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="{csrf_token}"> Do something important<br> <button type="submit">Submit</button> </form> ''' return html_content if __name__ == '__main__': app.run(debug=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值