表单验证客户端和服务器端
Posted
技术标签:
【中文标题】表单验证客户端和服务器端【英文标题】:Form validation client side and server side 【发布时间】:2011-10-17 10:18:01 【问题描述】:html 表单的验证应该在两边进行,同时在两边都使用正则表达式。
客户端:在不询问服务器的情况下向用户显示消息
服务器端:确认一切正常并进行安全检查,以防 js 被禁用或有人试图破解表单
我的问题是:我通常会在服务器端正则表达式和客户端正则表达式之间看到一些不一样的错误。
我在 C# 中,您认为 Regex 应该在后端,服务器应该将自己的 regex 放在客户端(Js)吗?
我想避免这种情况:
C# -> public const string AlphanumericField = @"[^A-Za-z0-9_]";
JS -> var alpahField = "[^A-Za-z_-]";
我想避免同时声明同一件事。
【问题讨论】:
您使用的是 webforms 还是 mvc? 【参考方案1】:对于regualtare 表达式,我总是使用asp.net 中提供的RegularExpressionValidator
查看:http://msdn.microsoft.com/en-us/library/eahwtc9e.aspx 了解有关正则表达式验证器的更多详细信息。
【讨论】:
但是你会有两个声明?一个在 C# 中,一个在 ValidationExpression 属性中?【参考方案2】:如果可能的话,您可以在您的应用程序中进行 AJAX 调用以进行客户端验证,这样您就可以将 RegEx 放在一个地方,并且易于测试。每次需要检查时,您可能会对服务器造成非常小的性能影响,但在许多情况下,可维护性是值得的。
【讨论】:
【参考方案3】:您可以要求 C# 使用注册客户端脚本块为 javascript 声明此变量
Dim cstext2 As New StringBuilder()
cstext2.Append("<script type=""text/javascript"">")
cstext2.Append("var alpahField = \"" + AlphanumericField +"\";")
cstext2.Append("script>")
RegisterClientScriptBlock(csname2, cstext2.ToString())
【讨论】:
【参考方案4】:您可以在客户端和服务器端使用完全相同的正则表达式(如正则表达式引擎所见),但您需要分别声明它们,因为 C# 和 JavaScript 使用不同的转义方案。以一个正则表达式为例,它验证一个双引号字符串,该字符串可能包含任何用反斜杠转义的字符。这是所需的本机正则表达式:
本机正则表达式:^"[^"\\]*(\\.[^"\\]*)*"$
正则表达式中的 Javascript 正则表达式:/^"[^"\\]*(\\.[^"\\]*)*"$/
逐字文字字符串中的 C# 正则表达式@"^""[^""\\]*(\\.[^""\\]*)*""$"
使用 Javascript 文字语法,唯一的元字符(需要转义)是正斜杠。使用存储在 C# 逐字文字字符串中的正则表达式,唯一的元字符是双引号,通过将两个双引号连续放置来“转义”。
RegexBuddy 解决方案
实现您的目标(为每个验证规则只维护一个主正则表达式)的一个好方法是使用:RegexBuddy (RB) 构建您的所有本机正则表达式。您可以将所有经过全面测试和调试的验证正则表达式(以及每个正则表达式的适当测试数据)存储在单个 regexbuddy 库文件中。然后只需使用 RB 的内置导出功能为代码生成(正确转义的)C# 和 Javascript 正则表达式 sn-ps。
如果您认真对待制作准确高效的正则表达式,那么无论如何您都应该使用此工具 - 测试每个正则表达式是否适用于所有边缘情况(匹配和不匹配)。
【讨论】:
以上是关于表单验证客户端和服务器端的主要内容,如果未能解决你的问题,请参考以下文章