Javascript 备注字段(客户端和服务器端)的正则表达式验证,很少有特殊标记
我已经研究这个问题两天了,运气不好。我在客户端使用asp.NETWebAPI2和jQueryAjax 我有一个用于输入备忘录文本的编辑框,允许的字符是Javascript 备注字段(客户端和服务器端)的正则表达式验证,很少有特殊标记,javascript,c#,asp.net,regex,webapi2,Javascript,C#,Asp.net,Regex,Webapi2,我已经研究这个问题两天了,运气不好。我在客户端使用asp.NETWebAPI2和jQueryAjax 我有一个用于输入备忘录文本的编辑框,允许的字符是^[©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\'“!?\(\)\[\]+$和两个标记和(可能是链接标记中的多个属性。问题是不允许使用其他标记-这意味着即使是简单的也应该被阻止。这种否定检查被证明有点复杂 请求帮助制定客户端javascript正则表达式和服务器端基于c的数据注释检查。您试图做的是清理用户输入,但是,使用jav
^[©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\'“!?\(\)\[\]+$
和两个标记
和
(可能是链接标记中的多个属性。问题是不允许使用其他标记-这意味着即使是简单的
也应该被阻止。这种否定检查被证明有点复杂
请求帮助制定客户端javascript正则表达式和服务器端基于c的数据注释检查。您试图做的是清理用户输入,但是,使用javascript和正则表达式是错误的 不要担心在前端验证用户输入,至少现在还没有,重点应该是首先验证it服务器端,完成这项工作的最佳工具是。用他们的话说: HtmlSanitizer是一个.NET库,用于从可能导致XSS攻击的结构中清除HTML片段和文档 HtmlSanitizer可以在多个级别进行定制:
- 通过属性AllowedTags配置允许的HTML标记
- 通过属性AllowedAttributes配置允许的HTML属性
- 通过属性AllowedCSSPProperties配置允许的CSS属性名称
- 通过属性AllowedAtRules配置允许的CSS at规则
- 通过属性AllowedSchemes配置允许的URI方案
- 配置包含URI的HTML属性(如“src”、“href”等)
- 提供一个基本URI,该URI将用于根据解析相对URI
- 可取消事件在移除标记、属性或样式之前引发
void Main()
{
var allowedTags = new[]{"LineBreak", "Link"};
var allowedAttributes = new[]{"attr"};
var sanitizer = new HtmlSanitizer(allowedTags: allowedTags, allowedAttributes: allowedAttributes);
//sanitizer.
var html = @"<script>alert('xss')</script><div onload=""alert('xss')""" + @"style=""background-color: test"">Test<img src=""test.gif""" + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>
<LineBreak></LineBreak>
<Link attr=""v123""/>";
var sanitized = sanitizer.Sanitize(html);
Console.WriteLine(sanitized);
}
void Main()
{
var allowedTags=new[]{“LineBreak”,“Link”};
var allowedAttributes=new[]{“attr”};
var sanitizer=新HtmlSanitizer(allowedTags:allowedTags,allowedAttributes:allowedAttributes);
//消毒剂。
var html=@“警报('xss')测试
";
var sanitized=sanitizer.Sanitize(html);
控制台写入线(消毒);
}
编辑 但我想知道为什么“regex是一种错误的方式” Regex不是为这种类型的任务而设计的,您需要能够解析html文档,这意味着在树状结构中解析这些属性中的标记、属性和值,以便能够正确地对其进行清理,因为只有Regex很难覆盖太多的边缘情况。Regex更好地用于抓取数据rom是一个已经存在于可预测结构中的源代码,用户输入不是其中之一 尽管您的用例足够简单,但您仍然允许用户键入HTML,并以原始格式重新显示给其他用户,因此您遗漏的任何内容都会让您头疼 下面是来自OWASP的示例,如果Regex可以涵盖这里列出的所有内容,我会说很好,但是在Regex中实现这一点非常困难,根本没有意义
另一方面,HtmlSanitizer确实涵盖了备忘单上列出的问题,它也得到了积极的维护,专门为此类应用而构建,它也不笨重,它可以处理大型消毒任务,处理时间在50-100ms范围内。通过结合RegulA表达式数据注释,允许使用尖括号(从而自定义标记) 并将其应用于相关控制器动作,如下所示-
[CustomTagValidator]
[RegularExpression(@"([©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\""!?\(\)\[\]\<\>\/]*)")]
public string PropertyToValidate { get; set; }
[ValidateModel]
public HttpResponseMessage Post([FromBody] MyModel mm)
希望这能帮助有类似问题的人
几乎忘记了,在客户端使用相同的基于正则表达式的javascript验证应用了相同的解决方案。谢谢@Aydin Adn。我昨天查看了这个库。对于一个简单的验证来说,它似乎有点笨重,因为如果正则表达式足够的话,我们实际上不需要“清理”所有输入。但是想知道为什么“正则表达式”是错误的方法“。虽然使用库有一些好处,“您仍然允许用户键入HTML,并以原始格式重新显示给其他用户”,但这一点并不完全正确,原因如下-1。只允许自定义标记为非“HTML”的换行符和链接”因此,2.这些标记不会以原始格式显示给其他用户,因为xsl转换将用于显示该内容。这就是为什么我们实际上不需要“html环境”,只需要验证自定义标记。
[CustomTagValidator]
[RegularExpression(@"([©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\""!?\(\)\[\]\<\>\/]*)")]
public string PropertyToValidate { get; set; }
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
[ValidateModel]
public HttpResponseMessage Post([FromBody] MyModel mm)