保护针对XSS和CSRF的bottle.py Web应用程序的方法?

时间:2013-04-15 22:50:32

标签: python security wsgi bottle

我正在使用bottle.pyBeaker编写一个用于会话和自定义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)

您将采取哪些额外检查来保护您的网络应用程序?

2 个答案:

答案 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有eescape过滤器:

<h2>No results for {{ search_query|escape }}</h2>