Skip to main content
 首页 » 编程设计

python之保护 bottle.py web 应用程序免受 XSS 和 CSRF 攻击的方法

2025年05月04日43shihaiming

我正在使用 bottle.py、用于 session 的 Beaker 和一个自定义的 AAA 编写模块编写一个网络应用程序,因为很多我担心安全性和最佳方法以防止像我提到的那样的一些有针对性的攻击。<​​/p>

例如,我有以下代码:

@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) 

您会执行哪些额外检查来保护您的网络应用程序?

请您参考如下方法:

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}}" />