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/)。对于其他例子,请看单元测试。



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中的开源字典组件   即使在成功执行删除查询之后,java更新的列表也不会显示在jsp页面中   java Apache:无法启动上下文路径/网站上的失败应用程序   java验证CSV中的特定列   对于具有专用内存的java应用程序,最小堆大小低于最大堆大小有意义吗?   java将数组中的值转换为多维数组   java在给定程序中,垃圾收集器在对象被取消引用之前正在运行。。。使用jre 7(32位)   java在运行时动态刷新文件夹   eclipse如何解决“java.net.BindException:地址已在使用:JVM_Bind”错误?   Java数组与数组   每次任务完成任务时,Java多线程都会安排任务   java部分编译时使用maven编织第三方jar   java Dokku单一回购中的多个应用程序   用apachevelocity生成javac/C++语言文件   java如何使用spring应用程序上下文中的属性文件实例化列表   java访问智能卡文件结构   具有GlobalMethodSecurity的java自定义UserDetailService循环引用   java如何集成Spring和JSF