在HTML表单字段中允许什么?

时间:2010-12-28 01:23:16

标签: html forms filtering field input-filtering

我有几个HTML表单,我正在服务器端实现这些字段的过滤(使用Java Servlets),我想知道我应该允许什么,或者我应该禁止什么。对于电子邮件地址,我删除了与此匹配的任何内容:

[^A-Za-z0-9._%-@]

我可以对名称,消息和电话号码字段应用哪些类似的规则。

我假设<和>应该被转义为& lt;和& gt;,我还应该替换什么?

除此之外,是否有关于此类字段允许的最大长度的建议?

3 个答案:

答案 0 :(得分:3)

您应该允许任何名称。考虑“O'Malley”或“Hudson-Walker”。有些语言(如Salish)包含数字,因此您可以使用“Sqwxwu7mish”。然后是重音人物,希伯来语,西里尔语,希腊语,中文,韩语,甚至是以前称为王子的音乐家。

消息文本应该同样不受约束。如果消息可以包含HTML,那么您将必须解析HTML(使用真正的HTML解析器)并应用标记和属性白名单,以便只允许通过您期望的内容。

电话号码也应该与自由形式非常接近。北美的格式与欧洲格式不同,有些人喜欢说“(555)555-5555”,而有些人喜欢“555-555-5555”,有些电话号码有扩展,有些则没有。

您在输入时应该担心的唯一编码是所有内容都是UTF-8(包括您的数据库)。并且,在与数据库交谈时,不要尝试自己编码,使用数据库驱动程序的引用机制和占位符。

长度通常应该比你想象的要大很多,所以在合理的最大值上加倍(至少)你的第一次猜测。名称和100的20个字符之间的存储差异对大多数应用程序来说并不重要,所以要慷慨。

在输出之前你不应该担心HTML编码,然后你应该使用你的环境支持的任何HTML和URL编码工具,不要试图建立你自己的。

不要过度约束你的输入,尽可能宽松和宽容。尽管你的输出非常严格。

答案 1 :(得分:3)

您需要先将&转移到&amp;,然后<转移到&lt;。与流行的看法相反,将>转移到&gt; 没有必要。如果无法打开,则无需保护关闭 HTML标记的括号。

您是否应该在写入数据库之前将其转义,或者是否应该每次都从数据库中读取它。在输入端执行它会更快;在输出端执行此操作将更安全,并且如果您在将其发送到另一个应用程序之前不必总是 unescape 之前,还可以更轻松地与其他应用程序交换数据。我个人会在输出端支付性能价格和unescape。缓存可以提供帮助。

您要进行的其余验证取决于数据类型。对于电子邮件地址,请检查以确保其后有@和至少一个.,然后,如果您关心它是否有效,请将该地址发送给测试电子邮件。几乎不可能完全验证电子邮件地址,即使地址在语法上有效,这仍然不意味着它可以被传递。同样,允许几乎任何东西作为URL然后尝试检索它以查看它是否有效。对于帐单/送货地址,请使用USPS Web服务以最佳格式验证和获取数据(适用于美国地址)。

答案 2 :(得分:1)

最大长度:我总是在客户端和服务器端的字段上应用最大长度。值与数据库中设置的最大值匹配。

我同意转义&lt;,&gt;和&amp; gt,&amp; lt。

我认为进行非常好的验证是一个好习惯。如果我正在使用姓名,消息和电话号码字段,我会执行以下操作。

对于每个文本框,使文本框根本不会采用无效值。
名称:aA-zZ
消息:'aA-zZ''0-9''。' ','';'等等。
电话号码:'0-9'不允许任何空格但允许' - ',你总是可以解析字符串服务器端。