python的输入验证框架
stoplight的Python项目详细描述
红灯[![构建状态](https://api.travis ci.org/painterjd/stoplight.png)(https://travis ci.org/painterjd/stoplight)
===
stoplight——python的输入验证框架
为什么要验证用户输入?
----
输入验证是向任何接受不受信任的用户输入的应用程序添加安全性的最基本的第一步。关于这个主题已经写了很多文章,但要点是通过清理所有用户输入来减少应用程序的攻击面,这样它就满足了应用程序所需的一组非常严格的标准,而不是更多。输入验证阻止的最常见攻击类型是[代码注入](http://en.wikipedia.org/wiki/code_injection)。
如果对用户输入进行清理,可以几乎完全避免大量用户输入漏洞(即[ShellShock](http://en.wikipedia.org/wiki/ShellShock\u28Software\u Bug%29))。
示例
----
假设我们的应用程序只接受美国电话号码。在这种情况下,我们的应用程序只需要接受n n n-nnn-nnnn,其中n是0-9之间的数字。如果用户传递了其他信息,我们可以将其丢弃。
BR/> StopeLink旨在解决的问题是输入验证逻辑与应用逻辑(特别是REST/REST类API框架)的混合。有时它们是不可分割的,但在几乎所有情况下,它们都不是。因此,让我们看一下上面提到的电话号码示例。
现在几乎所有的api框架都以类似的方式工作——您声明一个定义端点的函数,当http请求从客户端传入时,框架调用该函数。
``python
def post(self,account\u id,电话号码:
如果不是有效的帐户ID(帐户ID):
处理错误的帐户ID()
如果不是有效的电话号码(电话号码):
处理错误的电话号码()
型号。设置电话号码(帐户ID,电话号码)
````
这是一个简单的人工示例。通常情况下,事情会变得更加复杂。对于某些http动词,用户希望返回不同的响应。可能还有其他事情要完成。
电话号码)
```
这使我们能够有效地将“输入验证”逻辑与“业务逻辑”分离。
规则的创建相当简单。例如,这里是如何声明phone number rule
``python
phonenumberrule=rule(is_validate_phone_number(),lambda:abort(404))
````
这会导致我们得到一个有效的电话号码声明。
``python
@validation\u function
def是有效的电话号码(候选):
if(phone\u regex.match(候选)为none):
msg='不是有效的电话号码:{0}'
msg=msg.format(候选)
raise validationfailed(msg)
````
我们将验证与传输分离(例如,想象一个必须支持http和zmq的api)。它还允许我们集中验证逻辑,并为验证规则编写单独的测试。
如果未验证,则会引发validationprogrammingerror。
*允许验证全局范围的值(考虑线程本地存储中的项,就像在pecan框架中那样)
警告(todo):
----
*开销。这就是python和decorators的本质。
文档:
----
项目文档记录在readthedocs[此处](http://stoplight.readthedocs.org/en/latest/)。对于其他例子,请看单元测试。
===
stoplight——python的输入验证框架
为什么要验证用户输入?
----
输入验证是向任何接受不受信任的用户输入的应用程序添加安全性的最基本的第一步。关于这个主题已经写了很多文章,但要点是通过清理所有用户输入来减少应用程序的攻击面,这样它就满足了应用程序所需的一组非常严格的标准,而不是更多。输入验证阻止的最常见攻击类型是[代码注入](http://en.wikipedia.org/wiki/code_injection)。
如果对用户输入进行清理,可以几乎完全避免大量用户输入漏洞(即[ShellShock](http://en.wikipedia.org/wiki/ShellShock\u28Software\u Bug%29))。
示例
----
假设我们的应用程序只接受美国电话号码。在这种情况下,我们的应用程序只需要接受n n n-nnn-nnnn,其中n是0-9之间的数字。如果用户传递了其他信息,我们可以将其丢弃。
BR/> StopeLink旨在解决的问题是输入验证逻辑与应用逻辑(特别是REST/REST类API框架)的混合。有时它们是不可分割的,但在几乎所有情况下,它们都不是。因此,让我们看一下上面提到的电话号码示例。
现在几乎所有的api框架都以类似的方式工作——您声明一个定义端点的函数,当http请求从客户端传入时,框架调用该函数。
``python
def post(self,account\u id,电话号码:
如果不是有效的帐户ID(帐户ID):
处理错误的帐户ID()
如果不是有效的电话号码(电话号码):
处理错误的电话号码()
型号。设置电话号码(帐户ID,电话号码)
````
这是一个简单的人工示例。通常情况下,事情会变得更加复杂。对于某些http动词,用户希望返回不同的响应。可能还有其他事情要完成。
电话号码)
```
这使我们能够有效地将“输入验证”逻辑与“业务逻辑”分离。
规则的创建相当简单。例如,这里是如何声明phone number rule
``python
phonenumberrule=rule(is_validate_phone_number(),lambda:abort(404))
````
这会导致我们得到一个有效的电话号码声明。
``python
@validation\u function
def是有效的电话号码(候选):
if(phone\u regex.match(候选)为none):
msg='不是有效的电话号码:{0}'
msg=msg.format(候选)
raise validationfailed(msg)
````
我们将验证与传输分离(例如,想象一个必须支持http和zmq的api)。它还允许我们集中验证逻辑,并为验证规则编写单独的测试。
如果未验证,则会引发validationprogrammingerror。
*允许验证全局范围的值(考虑线程本地存储中的项,就像在pecan框架中那样)
警告(todo):
----
*开销。这就是python和decorators的本质。
文档:
----
项目文档记录在readthedocs[此处](http://stoplight.readthedocs.org/en/latest/)。对于其他例子,请看单元测试。