csrf攻击(Cross-Site Request Forgery)的原理是攻击者通过歹意网站或其他方式,向用户浏览器发送一些包括捏造的cookie或参数的要求,如果用户浏览器当前已登录了需要认证的网站,那末这些要求就会包括用户合法的认证信息,从而遭受攻击。这类攻击可以致使各种安全问题,比如盗取用户信息、篡改数据、歹意转账等。
浏览器有一些安全策略可以避免此类攻击,其中之一就是Same Origin Policy(同源策略)。同源策略要求网页只能从同一域名下加载脚本、样式表和图象等资源,这样在浏览器中打开的一个页面只能与同源页面通讯,而不能跨域访问其他页面的数据和资源。同源策略可以在一定程度上避免CSRF攻击。
接下来我们使用Python Flask框架演示一下CSRF攻击和如何防御。
首先,我们要配置一个包括CSRF token的表单,避免捏造要求:
from flask_wtf.csrf import CSRFProtect from flask_wtf import FlaskForm from wtforms import StringField app = Flask(__name__) app.secret_key = 'secret' csrf = CSRFProtect(app) class MyForm(FlaskForm): name = StringField('name') @app.route('/form', methods=['GET', 'POST']) def my_form(): form = MyForm() if form.validate_on_submit(): return 'Hello, ' + form.name.data return render_template('myform.html', form=form)
然后我们编写一个捏造网站的代码来攻击上面的表单:
from urllib.request import urlopen, Request from urllib.parse import urlencode url = 'http://localhost:5000/form' data = {'name': 'pidancode.com'} data = urlencode(data).encode('utf⑻') req = Request(url, data, method='POST') response = urlopen(req) print(response.read())
运行这段代码,可以看到它向上面的表单发送了一个POST要求,但是由于CSRF token不正确,要求被谢绝了。这样我们就避免了CSRF攻击。
本文来源:https://www.yuntue.com/post/83463.html | 云服务器网,转载请注明出处!