我正在暴露以下处理程序:
@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。
答案 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
希望这有帮助!