表单验证客户端和服务器端

时间:2011-08-01 12:34:46

标签: c# javascript regex

html表单的验证应该在双方都进行,并且双方都有正则表达式。

客户端:向用户显示消息而不询问服务器

服务器端:确认一切正常并进行安全检查以防js被禁用或有人试图破解表单

我的问题是:我经常看到服务器端正则表达式和客户端正则表达式之间存在一些不一样的错误。

我在C#中,您认为Regex应该在后端吗?服务器应该将自己的正则表达式放在客户端(Js)?

我想避免这种情况:

C# -> public const string AlphanumericField = @"[^A-Za-z0-9_]";
JS -> var alpahField = "[^A-Za-z_-]";

我想避免两个声明同样的事情。

4 个答案:

答案 0 :(得分:1)

对于regualtare表达式,我总是使用asp.net中提供的RegularExpressionValidator

检查:http://msdn.microsoft.com/en-us/library/eahwtc9e.aspx以获取有关正则表达式验证器的更多详细信息。

答案 1 :(得分:0)

如果可能,在您的应用中,您可以为客户端验证执行AJAX调用,这样您就可以将RegEx放在一个位置,并且可以轻松测试。每次需要检查时,您可能会在服务器上获得非常小的性能损失,但在许多情况下,可维护性是值得的。

答案 2 :(得分:0)

您可以要求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())

答案 3 :(得分:0)

您可以在客户端和服务器端使用完全相同的正则表达式(如正则表达式引擎所见),但您需要单独声明它们,因为C#和JavaScript使用不同的转义方案。以一个正则表达式为例,该正则表达式验证双引号字符串,该字符串可能包含使用反斜杠转义的任何字符。这是所需的原生正则表达式:

原生正则表达:
^"[^"\\]*(\\.[^"\\]*)*"$

正则表达式文字中的Javascript正则表达式:
/^"[^"\\]*(\\.[^"\\]*)*"$/

C#regex in verbatim literal string
@"^""[^""\\]*(\\.[^""\\]*)*""$"

使用Javascript文字语法,唯一的元字符(需要转义)是正斜杠。使用存储在C#verbatim文字字符串中的正则表达式,唯一的元字符是双引号,通过在行中放置两个双引号来“转义”。

RegexBuddy解决方案

实现目标的一个好方法(仅为每个验证规则维护一个主正则表达式)是使用:RegexBuddy(RB)构建所有本机正则表达式。您可以在一个regexbuddy库文件中存储所有经过全面测试和调试的验证正则表达式(以及每个正则表达式的相应测试数据)。然后只需使用RB的内置导出功能为代码生成(正确转义的)C#和Javascript正则表达式片段。

如果你真的想要制作准确有效的正则表达式,你应该真正使用这个工具 - 测试每个正则表达式是否适用于所有边缘情况(匹配和不匹配)。