我有几个HTML表单,我正在服务器端实现这些字段的过滤(使用Java Servlets),我想知道我应该允许什么,或者我应该禁止什么。对于电子邮件地址,我删除了与此匹配的任何内容:
[^A-Za-z0-9._%-@]
我可以对名称,消息和电话号码字段应用哪些类似的规则。
我假设<和>应该被转义为& lt;和& gt;,我还应该替换什么?
除此之外,是否有关于此类字段允许的最大长度的建议?
答案 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)
您需要先将&
转移到&
,然后<
转移到<
。与流行的看法相反,将>
转移到>
没有必要。如果无法打开,则无需保护关闭 HTML标记的括号。
您是否应该在写入数据库之前将其转义,或者是否应该每次都从数据库中读取它。在输入端执行它会更快;在输出端执行此操作将更安全,并且如果您在将其发送到另一个应用程序之前不必总是 unescape 之前,还可以更轻松地与其他应用程序交换数据。我个人会在输出端支付性能价格和unescape。缓存可以提供帮助。
您要进行的其余验证取决于数据类型。对于电子邮件地址,请检查以确保其后有@
和至少一个.
,然后,如果您关心它是否有效,请将该地址发送给测试电子邮件。几乎不可能完全验证电子邮件地址,即使地址在语法上有效,这仍然不意味着它可以被传递。同样,允许几乎任何东西作为URL然后尝试检索它以查看它是否有效。对于帐单/送货地址,请使用USPS Web服务以最佳格式验证和获取数据(适用于美国地址)。
答案 2 :(得分:1)
最大长度:我总是在客户端和服务器端的字段上应用最大长度。值与数据库中设置的最大值匹配。
我同意转义&lt;,&gt;和&amp; gt,&amp; lt。
我认为进行非常好的验证是一个好习惯。如果我正在使用姓名,消息和电话号码字段,我会执行以下操作。
对于每个文本框,使文本框根本不会采用无效值。
名称:aA-zZ
消息:'aA-zZ''0-9''。' ','';'等等。
电话号码:'0-9'不允许任何空格但允许' - ',你总是可以解析字符串服务器端。