我正在使用bottle.py
,Beaker
编写一个用于会话和自定义AAA编写模块的Web应用程序,因为很多我担心安全性和防止某些针对性攻击的最佳方法,例如一个我提到的。
作为一个例子,我有以下代码:
@route('/manage/adddomain',method='POST')
def adddomain():
#This checks if user has enough power to create a domain
aaa.require(50,'/forbidden')
user = aaa.getusername() # This is retrieved from a server side session
domainname = request.forms.get('domain')
description = request.forms.get('description')
# Additional checks are performed in the sql module
# to protect against forged requests with valid login
return sql.createdomain(user,domainname,description)
您将采取哪些额外检查来保护您的网络应用程序?
答案 0 :(得分:4)
Blender 几乎涵盖了您的需求,但我想添加其他方法。您可以添加一个包装器,而不是检查每个POST:
def wrap_requires_csrf(*methods):
def wrapper(fn):
@wraps(fn)
def wrapped(*args, **kwargs):
if request.method in methods:
if request.method == 'POST':
csrf = request.form.get('csrf')
elif request.method == 'GET':
csrf = request.args.get('csrf')
if not csrf or csrf != session.get('csrf'):
abort(400)
session['csrf'] = generate_csrf_token()
return fn(*args, **kwargs)
return wrapped
return wrapper
@app.route('/some/page', methods=['GET','POST'])
@wrap_requires_csrf('POST')
def some_page():
...
然后,在您的模板中,您将使用
提供隐藏字段<input name="csrf" type="hidden" name="{{session.csrf}}" />
答案 1 :(得分:2)
您需要在每个重要的表单字段中包含CSRF令牌,并使用模板引擎清理所有输出。
这是一个Flask snippet,你可以适应你的Bottle应用程序:
针对CSRF攻击的常用技巧是添加随机字符串 到会话,并检查该字符串对抗隐藏字段 POST。
@app.before_request def csrf_protect(): if request.method == "POST": token = session.pop('_csrf_token', None) if not token or token != request.form.get('_csrf_token'): abort(403) def generate_csrf_token(): if '_csrf_token' not in session: session['_csrf_token'] = some_random_string() return session['_csrf_token'] app.jinja_env.globals['csrf_token'] = generate_csrf_token
然后在你的模板中:
<form method=post action=""> <input name=_csrf_token type=hidden value="{{ csrf_token() }}">
至于消毒,这取决于您的模板引擎。 Jinja2有e
或escape
过滤器:
<h2>No results for {{ search_query|escape }}</h2>