我会尝试自己给出一个正确的答案:
名称中唯一应允许的标点是句号,撇号和连字符。在角落案例列表中,我还没有看到其他案例。
关于数字,只有一个8的情况。我想我可以放心地拒绝。
关于字母,任何字母都是有效的。
我也想包括空间。
这将总结为这个正则表达式:
^[p{L} .'-]+$
这提出了一个问题,即撇号可以用作攻击媒介。它应该被编码。
因此,验证代码应如下所示(未经测试):
var name = nameParam.Trim();if (!Regex.IsMatch(name, "^[p{L} .-]+$")) throw new ArgumentException("nameParam");name = name.Replace("'", "'"); //' does not work in IE
谁能想到一个名称不能通过该测试或可能通过的XSS或SQL注入的原因?
完整的测试解决方案
using System;using System.Text.Regularexpressions;namespace test{ class MainClass { public static void Main(string[] args) { var names = new string[]{"Hello World", "John", "João", "タロウ", "やまだ", "山田", "先生", "мыхаыл", "Θεοκλεια", "आकाङ्क्षा", "علاء الدين", "אַבְרָהָם", "മലയാളം", "상", "D'Addario", "John-Doe", "P.A.M.", "' --", "<xss>", """ }; foreach (var nameParam in names) { Console.Write(nameParam+" "); var name = nameParam.Trim(); if (!Regex.IsMatch(name, @"^[p{L}p{M}' .-]+$")) { Console.WriteLine("fail"); continue; } name = name.Replace("'", "'"); Console.WriteLine(name); } } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)