我正在尝试编写一个小的Python 2.x API来支持获取
job
jobNumber
,其中jobNumber
以整数形式提供。
有时,用户提供jobNumber
作为整数文字
从0开始,例如037537
。 (这是因为他们一直都是
被R娇恼,这是一种明智地考虑037537==37537
的语言。)
但是,Python会考虑以“0”开头的整数文字
是OCTAL,因此037537!=37537
,而不是037537==16223
。这个
让我感到公然侮辱最少的原则
令人惊讶的是,谢天谢地,这看起来像是在Python中修复的
3 ---见PEP 3127。
但我现在仍然坚持使用Python 2.7。所以我的用户这样做:
>>> fetchJob(037537)
并默默地得到错误的工作(16223),或者这个:
>>> fetchJob(038537)
File "<stdin>", line 1
fetchJob(038537)
^
SyntaxError: invalid token
Python拒绝八进制不兼容的数字。
似乎没有通过__future__
提供任何内容
让我得到Py3K的行为 - 它必须是内置的
以某种方式使用Python,因为它需要更改词法分析器
至少。
是否有人知道如何保护我的用户免受攻击 在这种情况下错误的工作?目前,我能想到最好的 是更改该API,因此它采用字符串而不是int。
答案 0 :(得分:6)
目前,我能想到的最好的方法是更改该API,使其占用字符串而不是int。
是的,我认为鉴于这种情况,这是一个合理的选择。
另一种选择是确保所有作业号码至少包含一个大于7的数字,这样添加前导零将立即给出错误而不是错误的结果,但这似乎比使用字符串更大的黑客攻击
最后一个选项可能是教育您的用户。只需要五分钟左右的时间来解释不添加前导零,如果你这样做会发生什么。即使他们因旧习惯而忘记或意外添加零,如果他们之前听说过,他们更有可能发现问题。
答案 1 :(得分:0)
也许您可以将输入作为字符串,剥离前导零,然后转换回int?
test = "001234505"
test = int(test.lstrip("0")) # 1234505