CherryPy - 防止使用路径basename作为参数

时间:2014-08-12 16:12:00

标签: python cherrypy

我正在暴露以下处理程序:

@cherrypy.expose
@auth
def test(self, id=0, **params):
    pass

我的意图是id永远是一个整数。在@auth装饰器中,我检查cherrypy.request.params以确保没有设置id,或者是一个整数。

我发现以下电话会绕过此检查:

GET /test/blah.php

在此调用中,id = blah.php,路径的基本名称,cherrypy.request.params为空。

我想返回404而不是将/blah.php设置为id参数。这将阻止自动扫描程序通过导航到虚构的URL来导致我的服务器出错。

如何阻止CherryPy使用部分路径作为第一个参数?在这种情况下,它应该调用id = 0。如果id不是关键字参数,则应该引发404。

2 个答案:

答案 0 :(得分:1)

如果您有幸能够使用python3,那么使用仅限关键字的语法将是最简单的方法。

def test(self, *, id=0, **params):
    pass

在python2中,您可以手动模拟它。

def test(self, **params):
    id = params.pop('id', 0)

答案 1 :(得分:0)

啊,我明白了。好吧,你可以接受所有变量并测试它们是整数......

@cherrypy.expose
@auth
def test(self, *args, **kwargs):
    ReGex = re.compile("^[0-9]+$")
    if(kwargs.get('id') == None or not ReGex.match(kwargs['id'])):
        raise cherrypy.HTTPError(403)

    # else legit user

希望这有帮助!