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

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

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

我假设应该将<和>逃脱为<and>,我还应该替换什么?

沿着这些线路,是否有关于此类字段允许的最大长度的建议?

有帮助吗?

解决方案

你需要逃脱 &&amp; 首先,然后 <&lt;. 。与普遍的看法相反,这是 不必要 逃离 >&gt;. 。无需保护括号 关闭 HTML标签如果没有办法 打开 一。

您对是否应在将其写入数据库之前应将其逃脱,或者是否应每次从数据库中读取。在输入侧进行操作将更快。在输出方面进行此操作将变得更加安全,并且如果您不必始终必须始终,请更轻松地与其他应用程序进行互换数据 Unescape 将其发送到另一个应用程序之前。我个人会在产出方面支付绩效价格并取消效果。缓存可以帮助您。

您要进行的其余验证取决于数据类型。有关电子邮件地址,请检查以确保其具有 @ 至少一个 . 之后,如果您关心它是否有效,请发送测试电子邮件的地址。几乎不可能完全验证电子邮件地址远远超过此地址,即使地址在句法上有效,这仍然并不意味着它可以交付。同样,几乎允许任何内容作为URL,然后 尝试检索 查看是否有效。有关计费/运输地址,请使用USPS Web服务来验证并以最佳格式获取数据(对于我们的地址)。

其他提示

您应该允许任何名称。考虑“ O'Malley”或“ Hudson-Walker”。某些语言(例如salish)包括数字,因此您可以拥有“ sqwxwu7mish”。然后是重音角色,希伯来语,西里尔,希腊,中国,韩语,甚至是以前被称为王子的音乐家。

消息文本应类似地不受约束。如果消息可以包含HTML,那么您将必须解析HTML(带有真正的HTML解析器),并应用标签和属性白名单才能通过您期望的东西允许事物。

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

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

长度通常应该比您认为的要大得多(至少)您应该以合理的最大程度的猜测两倍(至少)您的第一个猜测。对于大多数应用程序,一个名称和100个字符之间的存储差并不重要。

您不必担心HTML编码在输出之前进行编码,然后您应该使用HTML和URL编码工具的任何环境支持的工具,不要尝试构建自己的。

不要过度构成您的输入,尽可能松散和宽容。虽然对您的输出非常严格。

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

我同意逃避<,>和>,<。

我认为拥有很好的验证是一个好习惯。如果我使用名称,消息和电话号码字段,我将进行以下操作。

对于每个文本框,使文本框根本不会采用无效的值。
名称:aa-zz
消息:'aa-zz''0-9''。 ','';'' ETC..
电话号码:'0-9'不允许任何空间,但确实允许' - ',您可以随时解析字符串服务器端。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top