Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 备注字段(客户端和服务器端)的正则表达式验证,很少有特殊标记_Javascript_C#_Asp.net_Regex_Webapi2 - Fatal编程技术网

Javascript 备注字段(客户端和服务器端)的正则表达式验证,很少有特殊标记

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

我已经研究这个问题两天了,运气不好。我在客户端使用asp.NETWebAPI2和jQueryAjax

我有一个用于输入备忘录文本的编辑框,允许的字符是
^[©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)