2010-08-09 69 views
1

我正在尝试将创建表单时需要注意的事项放在一起。我知道我需要过滤输入内容。我已经在过滤错误的html和脚本,转义mysql,限制数据类型(电话号码是带有训练扩展数字的10+数字,电子邮件必须是电子邮件,字符串不能包含html或代码等),以及单词或字符限制(名称最多在4个单词之间用空格分隔,等等)。但我还应该做什么以及做什么的好方法?表单必须进行什么验证?最佳实践

此验证将在服务器上进行,但我正在寻找跨平台的最佳实践。数据将使用POST进行发布,所以我不必担心太多关于URL的问题。此外,表单呈现,提示,js输入掩码处理,几乎所有客户端的东西都已到位。

+0

什么类型的数据来自您的表单?例如,如果这是一个计算器应用程序,这有点太宽泛,没有意义讨论如何验证Unicode URL。 – 2010-08-09 23:45:05

+1

为什么你的框架没有为你处理“错误的html和脚本,转义mysql和限制数据类型”?你在用什么框架? – 2010-08-09 23:48:44

+0

我目前没有使用框架。我会喜欢一个很好的框架生成和验证在PHP中。 – 2010-08-10 16:47:48

回答

3

验证到最简单的术语:只接受你想要的。例如,如果您的电话字段只应包含数字(没有特定的电话号码格式)且不超过20个数字,则可以通过正则表达式来检查它,以确保它是您想要接受的内容,即([0-9]{7,20})

另一个例子,Twitter。它只接受最多15个字符的用户名,字母数字和下划线组成。所以验证正则表达式可能是:([a-zA-Z0-9]{1})([a-zA-Z0-9\_]{0,14})

表单验证也可以是安全检查的形式。一种可以是蜂蜜罐装,形式有效性等等。

形式Honey potting:防止自动/表单提交的垃圾邮件
形式有效性:形式加载时间和表单提交的时间之间的检查。如果太短,表单可能会被bot提交。如果花费太长时间,数据可能会过时并过期。
CAPTCHA:另一个级别的机器人预防/人只形成验证。

+0

所以我应该以某种方式跟踪何时显示表单,并在处理表单时进行检查。将时间和uid存储到会话变量中,并在表单提交中检查它,类似的东西? – 2010-08-10 16:34:01

+0

是的,就像那样 – mauris 2010-08-11 10:58:33

0

评论者S.洛特是正确的:逃避应该由框架自动照顾。如果你没有使用一个明确的框架,那么至少,你用来访问数据库的实用程序函数,并且显示页面上的数据应该分别针对SQL和HTML进行转义。如果你不得不担心在你的验证代码中逃跑,迟早你会犯一个错误,一些十二岁的剧本kiddy会用马色片取代你网站的内容。

0

在上下文中有意义的东西是好的,没有意义的东西是不好的。

如果本网站过滤为HTML,那么我们无法提供HTML示例。相反,它会处理HTML,以便输出它们而不是HTML。

小心过度验证。 <不一定是坏的,有各种各样的原因人们会使用<,>尤其是&。

同样,虽然Robert '); DROP TABLE Students;--不是您想要在您的学校注册的人,但如果您的预防意味着O'Brien,O'Tierney,O'Donovan和O'Flanagan无法注册,那么到时候奥唐奈被拒绝了,他会认为这是反爱尔兰种族主义并起诉你! (更为现实的情况是,我知道爱尔兰的这些人在SQL注入预防脚本阻止或破坏他们的姓氏时会去找一个竞争对手 - 尽管他们经常发现另一个网站,而不是阻止注入,因为任何一方都会以某种方式失败)。

验证,而不是安全检查是要确保某些东西似乎真实地反映了现实。事实上,人名中有'他们和公司名称和城镇名称一直有&,并且“验证”表示阻止将有效数据变为无效的块。实际上,信用卡号码是16位数(一些借记卡19位数)并通过了luhn检查,电子邮件地址有一个用户信息部分,一个@和一个带有MX记录的主机名。人们的名字永远不会是零字符。这是验证。只有拒绝(而不是逃避)它真的是无效的。