精华内容
下载资源
问答
  • fluent validation

    2015-06-16 09:51:00
    1.摘抄 认识Fluent Vaidation.  看到NopCommerce项目中用到这个组建是... Fluent Validation 翻译为:流畅验证  开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表...

    1.摘抄

    认识Fluent Vaidation.
      看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真是一个天才的想法,后来才知道这个东西是一个开源的轻量级验证组建。
     
      Fluent Validation 翻译为:流畅验证
     
      开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that uses a fluent interface and lambda expression for building validation rules for you business objects.)
     
      这个类库不仅仅可以使用的asp.net mvc项目中,普通的类库中也可以使用,当然在asp.net form项目中也支持。
    怎么使用:  
      是不是好用,还要看使用时是否真的像其官网建议描述一样。我比较喜欢其官网上的例子,一眼就能看出用法上的感觉,绝对是如其名,流畅,这个也一种解释型语言常见的的一种用法,无限的对一个类型支持无限度个属性扩展。
    业务实体类:
     
    复制代码代码如下:
    
     public class Person 
     {
         public string NameField;
         public int Id { get; set; }
         public string Surname { get; set; }
         public string Forename { get; set; }
         public List<Person> Children { get; set; }
         public string[] NickNames { get; set; }
         public DateTime DateOfBirth { get; set; }
         public int? NullableInt { get; set; }
         public Person() 
         {
             Children = new List<Person>();
             Orders = new List<Order>();
         }
         public int CalculateSalary()
         {
             return 20;
         }
         public Address Address { get; set; }
         public IList<Order> Orders { get; set; }
         public string Email { get; set; }
         public decimal Discount { get; set; }
         public double Age { get; set; }
         public int AnotherInt { get; set; }
         public string CreditCard { get; set; }
         public int? OtherNullableInt { get; set; }
     }
     public interface IAddress 
     {
         string Line1 { get; set; }
         string Line2 { get; set; }
         string Town { get; set; }
         string County { get; set; }
         string Postcode { get; set; }
         Country Country { get; set; }
     }
     public class Address : IAddress 
     {
         public string Line1 { get; set; }
         public string Line2 { get; set; }
         public string Town { get; set; }
         public string County { get; set; }
         public string Postcode { get; set; }
         public Country Country { get; set; }
         public int Id { get; set; }
     }
     public class Country
     {
         public string Name { get; set; }
     }
     public interface IOrder 
     {
         decimal Amount { get; }
     }
     public class Order : IOrder 
     {
         public string ProductName { get; set; }
         public decimal Amount { get; set; }
     }
     
    对Person的指定验证规则:  
     
    复制代码代码如下:
    
     using FluentValidation;
     public class CustomerValidator: AbstractValidator<Customer>
     {
       public CustomerValidator() 
       {
         RuleFor(customer => customer.Surname).NotEmpty();
         RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
         RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
         RuleFor(customer => customer.Address).Length(20, 250);
         RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
       }
       private bool BeAValidPostcode(string postcode) 
       {
         // custom postcode validating logic goes here
       }
     }
     // 手动验证规则
     Customer customer = new Customer();
     CustomerValidator validator = new CustomerValidator();
     ValidationResult results = validator.Validate(customer);
     bool validationSucceeded = results.IsValid;
     IList<ValidationFailure> failures = results.Errors;
     
    Flent validation怎么与asp.net mvc验证库整合?
      如果在asp.net mvc中现实中这么用,可能会有很多人不会知道他,我们知道Asp.net MVC项目中有自己的验证机构[企业库VAB(Validation Application Block),基于Attribute声明式验证],其使用方法,也被我们都一直很认可,但其也有很多不够灵活的,但Fluent Validation确实更灵活一点。使用起来多变性,流畅,而且验证规则是一个单独的类,是和业务实体对象分类的,我们不需要翔VAB一样,需要在业务实体类上使用Attribute注册验证规则。
     
      既然其不是ASP.NET MVC的默认验证规则类库,我们就需要注册到ASP.NET MVC的验证规则库中。
     
    复制代码代码如下:
    
     // 在Global.asax.cs中的Applicaton_Start()函数中注册为asp.net mvc默认的验证规则库。
     // fluent validation
     FluentValidationModelValidatorProvider provider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
     ModelValidatorProviders.Providers.Add(provider);
     DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
     
    注意:
      1,)作为Fluent Validation验证规则类须继承AbstractValidator<T>;
     
      2,)我们也可以仿照NopCommerce的处理方法,对AttributeValidatorFactory类的Validator(Type type)函数重写,在特殊的业务环境下支持其他验证规则。
    

     2.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using FluentValidation;
    using FluentValidation.Results;
    
    
    namespace FluentValidationTest {
        class TestValidator : AbstractValidator<Test> {
            public TestValidator() {
                RuleFor(customer => customer.Name).NotEmpty().WithMessage("this is required");
                RuleFor(c => c.Name).Must(BeMale).WithMessage("need to be male");
                RuleFor(c => c.Name).Length(0, 255).WithMessage("need to be between 0 and 255");
                RuleFor(c => c.Name).NotEqual("male").WithMessage("cannot be male");
                RuleFor(c => c.Discount).NotEqual(0).When(c => c.HasDiscount);
            }
    
            private bool BeMale(String name) {
                return name.Equals("male");
            }
        }
    
        class Test {
            public String Name { get; set; }
            public bool HasDiscount { get; set; }
            public double Discount { get; set; }
        }
    
        class Program {
            static void Main(string[] args) {
                TestValidator validator = new TestValidator();
                Test t = new Test() { Name = "user",HasDiscount = true};
    
                ValidationResult result = validator.Validate(t);
                bool isValid = result.IsValid;
                IList<ValidationFailure> failures = result.Errors;
            }
        }
    }
    

     

    转载于:https://www.cnblogs.com/hualiu0/p/4579967.html

    展开全文
  •  Fluent Validation 翻译为:流畅验证    开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that ...
  • 翻译稿 : https://github.com/dotnetcore/aspnetcore-doc-cn/blob/dev/aspnet/tutorials/first-mvc-app/validation.rst</p><p>该提问来源于开源项目:dotnetcore/aspnetcore-doc-cn</p></div>
  • 1.概述 这个jQuery插件简化了客户端表单验证,同时还提供了大量的自定义选项。... 所有捆绑方法都带有英语的默认错误消息,并翻译成其他37种语言。 该插件最初是由JQuery团队的成员JörnZaeff...

    1.概述

    这个jQuery插件简化了客户端表单验证,同时还提供了大量的自定义选项。 如果您从头开始构搭建,且尝试将某些内容集成到具有大量现有标记的现有应用程序时,它也是一个不错的选择。 该插件捆绑了一组有用的验证方法,包括URL和电子邮件验证,同时提供API来编写自己的方法。 所有捆绑方法都带有英语的默认错误消息,并翻译成其他37种语言。

    该插件最初是由JQuery团队的成员JörnZaefferer编写和维护的,他是jQuery UI团队的首席开发人员和QUnit的维护者。 它始于2006年jQuery的早期阶段,并从那时起进行了更新和改进。

    从版本1.15.0开始,Markus Staab于2016年2月接管了代码库的维护。自2016年7月起,Brahim Arkni协助Markus,几个月后,Brahim加入了jQuery Validation核心团队。

    当前版本:1.19.0

    License: MIT

    2.依赖

    要求

    jquery,用1.7.2、1.8.3、1.9.1、1.11.1、3.1.1进行测试

    3.文档

    验证您之前从未验证过的表单!
    "But doesn't jQuery make it easy to write your own validation plugin?"
    当然,但仍有许多细微之处需要注意:您需要一个标准的验证方法库(例如电子邮件,URL,信用卡号)。您需要在DOM中放置错误消息,并在适当时显示和隐藏它们。你想要的不仅仅是提交事件,比如keyup和blur。
    根据您在不同项目中使用的服务器端环境,您可能需要不同的方法来指定验证规则。毕竟,你不想重新发明轮子,对吗?

    “但是那里已经没有大量的验证插件吗?”
    是的,有很多非基于jQuery的解决方案(自从你找到jQuery后就可以避免)和一些基于jQuery的解决方案。这个特别的插件是最古老的jQuery插件之一(始于2006年7月),并在世界各地的项目中证明了自己。还有一篇文章讨论了这个插件如何符合应该验证的解决方案。

    不相信?看看这个例子:

    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>Please provide your name, email address (won't be published) and a comment</legend>
        <p>
          <label for="cname">Name (required, at least 2 characters)</label>
          <input id="cname" name="name" minlength="2" type="text" required>
        </p>
        <p>
          <label for="cemail">E-Mail (required)</label>
          <input id="cemail" type="email" name="email" required>
        </p>
        <p>
          <label for="curl">URL (optional)</label>
          <input id="curl" type="url" name="url">
        </p>
        <p>
          <label for="ccomment">Your comment (required)</label>
          <textarea id="ccomment" name="comment" required></textarea>
        </p>
        <p>
          <input class="submit" type="submit" value="Submit">
        </p>
      </fieldset>
    </form>
    <script>
    $("#commentForm").validate();
    </script>

    这不是那么好吗?
    单行jQuery选择表单并应用验证插件,并在每个元素上添加一些注释以指定验证规则。

    当然,这不是指定规则的唯一方法。您也不必依赖这些默认消息,但在首次为表单设置验证时它们会派上用场。

    在进行这个演示时需要注意的一些事项
    在尝试提交无效表单后,第一个无效元素被聚焦,允许用户更正该字段。如果另一个无效字段(不是第一个字段)在提交之前被重点关注,那么该字段将被聚焦,允许用户在他或她更喜欢的情况下从底部开始。
    在字段被标记为无效之前,验证是惰性的:在第一次提交表单之前,用户可以在不显示恼人消息的情况下通过字段进行选项卡 - 在有机会实际输入正确值之前,它们不会被窃听
    一旦字段被标记为无效,它就会得到即刻的验证:一旦用户输入了必填的正确值,就会移除错误消息
    如果用户在非标记字段中输入内容,并且标签/点击远离它(模糊字段),则会进行验证 - 显然用户有意输入内容,但未能输入正确的值
    当点击验证插件的演示时,这种行为可能会令人恼火 - 它专为不显眼的用户体验而设计,尽可能少地使用不必要的错误消息让用户烦恼。

    3.API 文档

     

    在整个文档中,经常使用两个术语,因此在验证插件的上下文中了解它们的含义非常重要:

    • 方法: 验证方法实现验证元素的逻辑,就像检查文本输入值的正确格式的电子邮件方法一样。 提供了一套标准方法,您可以轻松编写自己的方法。
    • 规则: 验证规则将元素与验证方法相关联,例如“使用名称验证输入”主邮件"required" and "email"。

    这个库添加了三个jQuery插件方法,主要入口点是validate方法:

     Custom selectors

    • validate() - 验证选定的表单。
    • valid() - 检查所选表单或所选元素是否有效。
    • rules() - 读取,添加和删除元素的规则。

    该库还使用三个自定义选择器扩展了jQuery:

    • :blank  - 选择具有空值的所有元素。
    • :filled  - 选择具有填充值的所有元素。
    • :unchecked  - 选择未选中的所有元素。

     Validator

    validate方法返回一个Validator对象,该对象具有一些可用于以编程方式触发验证或更改表单内容的公共方法。 验证器对象有更多方法,但只有这里记录的方法可供使用。

    • Validator.form() - 验证表单。
    • Validator.element() - 验证单个元素。
    • Validator.resetForm() - 重置受控表单。
    • Validator.showErrors() - 显示指定的消息。
    • Validator.numberOfInvalids() - 返回无效字段的数量。
    • Validator.destroy() - 销毁验证器的这个实例。

    还如如下几个静态方法:

    • jQuery.validator.addMethod() - 添加自定义验证方法。
    • jQuery.validator.format() - 用参数替换{n}个占位符。
    • jQuery.validator.setDefaults() - 修改验证的默认设置。
    • jQuery.validator.addClassRules() - 添加复合类方法。

    提供如下标准的验证方法:

    • required  - 使元素成为必需元素。
    • remote  - 请求资源检查元素的有效性。
    • minlength  - 使元素需要给定的最小长度。
    • maxlength  - 使元素需要给定的最大长度。
    • rangelength  - 使元素需要给定的值范围。
    • min  - 使元素需要给定的最小值。
    • max  - 使元素需要给定的最大值。
    • range  - 使元素需要给定的值范围。
    • step  - 使元素需要给定的步骤。
    • 电子邮件 - 使元素需要有效的电子邮件
    • url  - 使元素需要有效的url
    • date  - 使元素需要一个日期。
    • dateISO  - 使元素需要ISO日期。
    • number  - 使元素需要十进制数。
    • digits  - 使元素仅需要数字。
    • equalTo  - 要求元素与另一个元素相同

    还有一些方法作为附件提供,目前包含在下载包中的additional-methods.js中。 并非所有这些都记录在这里:

    • accept  - 使文件上载仅接受指定的mime-types。
    • creditcard  - 使元素需要信用卡号。
    • extension  - 使元素需要特定的文件扩展名。
    • phoneUS  - 验证有效的美国电话号码。
    • require_from_group  - 确保组中给定数量的字段完整。

    可以使用$ .validator.methodsproperty重新定义内置规则的实现。

     

    When you have a name attribute like user[name], make sure to put the name in quotes. More details in the General Guidelines.

    Another common problem occurs with this code:

    1

    2

    3

    4

    5

    6

    7

    8

    
     

    $("#myform").validate({

    submitHandler: function(form) {

    // some other code

    // maybe disabling submit button

    // then:

    $(form).submit();

    }

    });

    This results in a too-much-recursion error: $(form).submit() triggers another round of validation, resulting in another call to submitHandler, and voila, recursion. Replace that with form.submit(), which triggers the native submit event instead and not the validation.

    So the correct code looks slightly different:

    1

    2

    3

    4

    5

    
     

    $("#myform").validate({

    submitHandler: function(form) {

    form.submit();

    }

    });

     Demos

    Based on an old version of the marketo.com sign-up form. The custom validation was once replaced with this plugin. Thanks to Glen Lipka for contributing it!

    Notable features of the demo:

    • Customized message display: No messages displayed for the required method, only for typing-errors (like wrong email format); A summary is displayed at the top ("You missed 12 fields. They have been highlighted below.")
    • Remote validation of email field. Try to enter eg. glen@marketo.com
    • Integration with masked-input plugin, see Zip and Phone fields and Credit Card Number on step 2
    • A custom method for making the billing address on step 2 optional when "Same as Company Address" is checked
    • A custom method for checking the password: Checks that the password contains at least one number and one character and that it is at least 6 characters long. If the user blurs the field with an invalid value, the input is emptied and gets focus again.

    The sign-up form from rememberthemilk.com (based on an older version). The custom validation was replaced using this plugin. Thanks to RTM for contributing!

    Notable features of the demo:

    • Custom message display, based on the original table layout, using success option to display a checkmark for valid fields
    • Remote validation of username, to check if it is already taken (try "Peter", "asdf" or "George")

    Contributed by Michael Evangelista, showing a multipart form for buying and selling houses.

    Notable features of the demo:

    • Multipart, implemented using the jQuery UI accordion and a custom method to check if an element is on the current page when validated
    • Integration with masked-input plugin, see Phone and Zip fields

    Features remote validation for helping the user to fill out captchas.

    Notable features of the demo:

    • Remote validation to check if the user entered the correct captcha, without forcing him to submit the form first
    展开全文
  • Try testing the following form with valid and invalid email addresses. The code uses javascript to match the users input with a regular expression. 函数代码: 代码如下: function validate(form_id,email...
  • 认识Fluent Vaidation.  看到NopCommerce项目中用到这个... Fluent Validation 翻译为:流畅验证  开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业...

    认识Fluent Vaidation.

      看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真是一个天才的想法,后来才知道这个东西是一个开源的轻量级验证组建。
     
      Fluent Validation 翻译为:流畅验证
     
      开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that uses a fluent interface and lambda expression for building validation rules for you business objects.)
     
      这个类库不仅仅可以使用的asp.net mvc项目中,普通的类库中也可以使用,当然在asp.net form项目中也支持。
     
    怎么使用:  
      是不是好用,还要看使用时是否真的像其官网建议描述一样。我比较喜欢其官网上的例子,一眼就能看出用法上的感觉,绝对是如其名,流畅,这个也一种解释型语言常见的的一种用法,无限的对一个类型支持无限度个属性扩展。
     
         业务实体类:
     
    复制代码
     1 public class Person 
     2 {
     3     public string NameField;
     4     public int Id { get; set; }
     5     public string Surname { get; set; }
     6     public string Forename { get; set; }
     7 
     8     public List<Person> Children { get; set; }
     9     public string[] NickNames { get; set; }
    10         
    11     public DateTime DateOfBirth { get; set; }
    12 
    13     public int? NullableInt { get; set; }
    14 
    15     public Person() 
    16     {
    17         Children = new List<Person>();
    18         Orders = new List<Order>();
    19     }
    20     
    21     public int CalculateSalary()
    22     {
    23         return 20;
    24     }
    25 
    26     public Address Address { get; set; }
    27     public IList<Order> Orders { get; set; }
    28 
    29     public string Email { get; set; }
    30     public decimal Discount { get; set; }
    31     public double Age { get; set; }
    32     public int AnotherInt { get; set; }
    33 
    34     public string CreditCard { get; set; }
    35 
    36     public int? OtherNullableInt { get; set; }
    37 }
    38 
    39 public interface IAddress 
    40 {
    41     string Line1 { get; set; }
    42     string Line2 { get; set; }
    43     string Town { get; set; }
    44     string County { get; set; }
    45     string Postcode { get; set; }
    46     Country Country { get; set; }
    47 }
    48 
    49 public class Address : IAddress 
    50 {
    51     public string Line1 { get; set; }
    52     public string Line2 { get; set; }
    53     public string Town { get; set; }
    54     public string County { get; set; }
    55     public string Postcode { get; set; }
    56     public Country Country { get; set; }
    57     public int Id { get; set; }
    58 }
    59 
    60 public class Country
    61 {
    62     public string Name { get; set; }
    63 }
    64 
    65 public interface IOrder 
    66 {
    67     decimal Amount { get; }
    68 }
    69 
    70 public class Order : IOrder 
    71 {
    72     public string ProductName { get; set; }
    73     public decimal Amount { get; set; }
    74 }
    复制代码
      对Person的指定验证规则:  
     
    复制代码
     1 using FluentValidation;
     2 
     3 public class CustomerValidator: AbstractValidator<Customer>
     4 {
     5   public CustomerValidator() 
     6   {
     7     RuleFor(customer => customer.Surname).NotEmpty();
     8     RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
     9     RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    10     RuleFor(customer => customer.Address).Length(20, 250);
    11     RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
    12   }
    13 
    14   private bool BeAValidPostcode(string postcode) 
    15   {
    16     // custom postcode validating logic goes here
    17   }
    18 }
    19 
    20 // 手动验证规则
    21 Customer customer = new Customer();
    22 CustomerValidator validator = new CustomerValidator();
    23 ValidationResult results = validator.Validate(customer);
    24 
    25 bool validationSucceeded = results.IsValid;
    26 IList<ValidationFailure> failures = results.Errors;
    复制代码
    Flent validation怎么与asp.net mvc验证库整合?
      如果在asp.net mvc中现实中这么用,可能会有很多人不会知道他,我们知道Asp.net MVC项目中有自己的验证机构[企业库VAB(Validation Application Block),基于Attribute声明式验证],其使用方法,也被我们都一直很认可,但其也有很多不够灵活的,但Fluent Validation确实更灵活一点。使用起来多变性,流畅,而且验证规则是一个单独的类,是和业务实体对象分类的,我们不需要翔VAB一样,需要在业务实体类上使用Attribute注册验证规则。
     
      既然其不是ASP.NET MVC的默认验证规则类库,我们就需要注册到ASP.NET MVC的验证规则库中。
     
        
     
    复制代码
    1 // 在Global.asax.cs中的Applicaton_Start()函数中注册为asp.net mvc默认的验证规则库。
    3 // fluent validation
    4 FluentValidationModelValidatorProvider provider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
    5 ModelValidatorProviders.Providers.Add(provider);
    7 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
    复制代码
    注意:
      1,)作为Fluent Validation验证规则类须继承AbstractValidator<T>;
     
      2,)我们也可以仿照NopCommerce的处理方法,对AttributeValidatorFactory类的Validator(Type type)函数重写,在特殊的业务环境下支持其他验证规则。

    转载于:https://www.cnblogs.com/ranran/p/4120833.html

    展开全文
  • Address validation is used by QUIC to avoid being used for a traffic amplification attack. In such an attack, a packet is sent to a server with spoofed source address information that identifies a vi....

    英文原文链接:8. Address Validation

      地址有效性被 QUIC 用于防止流量放大攻击。在这种攻击下,攻击者使用受害者的地址作为包的源地
    址并发送给服务端。如果服务端生成更多或者更大的包作为攻击包的响应,攻击者则可以利用服务端向受
    害者发送更多的数据,这些数据量比攻击者发送的数据量要大。
      放大攻击的主要防御手段就是验证能接收包的端点的传输层地址的有效性。地址有效性验证是在连接
    建立阶段(详见 8.1 小节)或连接迁移阶段(详见 8.2 小节)完成的,
    

    8.1. Address Validation During Connection Establishment

      连接的建立隐式地为两端提供了地址有效性验证,接收到一个用握手的密钥保护的包意味着客户单接收
    到了从服务端发送的 Initial 包。一旦服务端成功处理了一个客户端发送的 Handshake 包,那么它
    可以认为客户端的地址已经被验证为有效。
      在验证客户端的地址有效之前,服务端不可以发送超过它接受到的数据的三倍大小的数据;这限制了
    任何通过伪造源地址进行放大攻击的攻击强度;在确定这个限制值时,服务端只需要计算已经成功处理
    的包的总大小。
    
      客户端必须保证包含 Initial 包的 UDP 报文至少有 1200 字节的载荷,可通过填充来达到该大
    小。客户端发送填充的报文可以确保服务端不会过度受到放大限制的约束。
      包丢失,尤其是服务端的 Handshake 包丢失,会造成服务端无法发送数据,假设此时服务端还没
    达到发送上限且客户端也没有数据发送;为了避免造成握手死锁发生,客户端应该在探测超时时发送一个
    包,如 [QUIC-RECOVERY] 所述。如果客户端没有重传数据并且也没有 Handshake 密钥,它应该发送
    一个包含 Initial 包的 UDP 报文,报文载荷至少为 1200 字节;如果客户端有 Handshake 密钥,
    则它应该发送一个 Handshake 包。 
    
      服务端也许希望在开始加密握手之前验证客户端地址的有效性;QUIC 在完成握手之前,会使用包含在
    Initial 包中的令牌来提供地址有效性验证,这个令牌在连接建立阶段通过 Retry 包(
    详见 8.1.1 小节)传输给客户端,或者在之前的连接上通过 NEW_TOKEN 帧(详见 8.1.2 小节)来
    传输给客户端。
      除了在地址验证之前强制限制发送的数据量,服务端还会被拥塞控制限制可以发送多少数据;
    而客户端只被拥塞控制限制。
    

    8.1.1. Address Validation using Retry Packets

      一旦收到客户端的 Initial 包,服务端可以通过发送包含令牌的 Retry 包来请求客户端地址有效性
    验证;客户端在收到这个 Retry 包后必须将该令牌附加待发送的 Initial 包中(同一条连接)。服
    务端在收到带有令牌的 Initial 包时,可以选择中止连接,或者允许该包被继续处理。
    
      只要攻击者不可能为它自己的地址生成一个有效的令牌,那么合法客户端就可以通过返回服务端
    的令牌来向服务端证明自己的合法性。
    
      服务端可以使用 Retry 包来使状态延后转移,这增加了连接建立的处理成本。要求服务端提供一
    个不同的连接 ID 以及传输参数 original_connection_id(18.2 小节所定义),将强制服务端证明
    自己或与自己交互的实体接收到了客户端的原始 Initial 包(译者注:否则任何实体都可以更换连接 
    ID)。 Retry 包的使用见下图:
    

    8.1.2. Address Validation for Future Connections

      服务端可以在一次连接中为客户端提供一个用于验证地址有效性的令牌,这个令牌也可用于随后的连接。
    地址有效性验证对 0-RTT 尤其重要,因为服务端可能会向客户端发送大量的数据来响应 0-RTT 数据。
    
      服务端使用 NEW_TOKEN 帧(详见 19.7 小节)向客户端提供一个验证地址有效性的令牌,这个令牌可
    以用于随后的连接。客户端必须在后续连接的 Initial 包中包含这个令牌来验证地址的有效性,除非收到一
    个用于替换旧令牌的 Retry 包,客户端不可以在后续连接中使用从 Retry 包中获取的令牌;服务端可以丢
    弃未带合法令牌的 Initial 包。
    
      令牌需要以这样的方式去构造,即允许服务端区分它是否来自 Retry 包。
    
      令牌不可以包含未加密的特殊信息,这些信息可以被监听者利用并将令牌与连接关联起来。例如,它不
    能包含连接 ID,或者地址信息,除非这些信息是加密的。
    
      不像在 Retry 中创建的令牌,其他令牌在创建到被使用有一段时间差。因此,令牌应该有一个过期时间,
    可以是一个明确的过期时间,或者是一个可以用于动态计算过期时间的时间戳。服务端可以存储这个过期
    时间,或者把过期时间加密在令牌中。
    
      客户端的两条连接不会共用同一个端口,因此验证端口是不可能成功的。
    
      如果客户端从之前连接的 NEW_TOKEN 帧收到一个令牌,并且客户端认为之前连接与当前连接是同样
    的服务端,那么它应该把收到的这个令牌包含在 Initial 包的 Token 域,这样可以减少一个用于验证客户端
    地址的 RTT。
    
      令牌允许服务端将创建令牌的连接和使用该令牌的连接建立关联。客户端如果不想继续使用某个服务端
    的令牌,可以丢弃从 NEW_TOKEN 获取的令牌。从 Retry 包中获取的令牌必须在当前尝试建连时被立即
    使用,而不应在后续的尝试建连时被使用。
    
      客户端不应该在不同连接中复用一个令牌。复用令牌将允许网络链路中的节点将连接和令牌建立关联
    (详见 9.5 小节)。客户端不可以复用一个令牌除非它相信本端在最后一次使用令牌后发生了网络切换
    (本地 IP 或网卡改变)。客户端需要重新启动连接,如果在握手完成前发生了   本地地址的任何改变。
    
      客户端可能在一条连接上收到多个令牌。假如不讨论令牌与连接的关联性问题,任何令牌是可以用于任
    何尝试建连的过程。服务端可以发送额外的令牌来使得多个尝试建连的地址有效,或者替换旧的已失效令
    牌。对于客户端来说,这样的二义性意味着发送最近未使用的令牌是更高效的做法。即使保存使用旧的令
    牌没有负面影响,客户端可以认为在向服务端验证地址有效性时,旧令牌的价值会比较小。
    
      当服务端接收到带有验证地址有效性的令牌的 Initial 包时,它必须尝试验证令牌的合法性,除非它
    已经完成了地址有效性验证。如果令牌是非法的,服务端应该认为客户端的地址无效,并可能发送一个
    Retry 包。如果地址有效性验证成功,服务端应该允许握手继续进行。
    
        注意:把客户端当成是无效的而不是直接把包丢弃的根本原因在于,客户端也许在之前的连接上通过 
      NEW_TOKEN 帧接收了令牌,如果服务端丢失了状态信息则无法验证另外的有效性,如果丢弃了包那
      么会导致连接失败。服务端应该把 NEW_TOKEN 帧和 Retry 包中的令牌按不同的方式编码,而且对于 
      Retry 包中的令牌的验证需要更加严格。
    
      在一个无状态设计中,服务端可以使用加密认证的令牌来向客户端传递随后在服务端可以恢复的信息,
    也可以使用这样的令牌来验证客户端地址的有效性。令牌未被集成到加密握手中,因此它们未被认证。
    例如,客户端可以重复使用一个令牌;为了相关攻击利用这个特性,服务端    可以限制令牌只包含用于
    验证客户端地址的信息。
    
      攻击者可以重放令牌从而使服务端作为 DDOS 攻击的放大器。为了免受这类攻击的伤害,服务端应该
    确保通过 Retry 包发送的令牌只在较短的一段时间内有效。通过 NEW_TOKEN 帧(详见 19.7 小节)提
    供的令牌可以有较长的有效期,但不应该在一段较短的时间内被接受多次。如果可能的话,鼓励服务端
    只允许令牌的有效次数为一。
    

    8.1.3. Address Validation Token Integrity

      验证地址有效性的令牌必须难以被猜到,在令牌中包含一个足够大的随机值可以保证这一点,但需要服
    务端记住发给某个客户端的随机值。
      
      基于令牌的方案允许服务端将与地址有效性验证的状态转移到客户端。为了是这种设计能够起作用,令
    牌必须被完整性保护防止被客户意外端修改或者篡改。没有完整性保护的话,恶意客户端可以生成或者猜
    到可以被服务端接受的随机值。只有服务端会要求访问令牌的完整性保护密钥。
      
      不需要为令牌单独指定一个格式,因为令牌既由服务端生成,又由它自己消费。令牌可以包含客户端的
    地址信息(IP 和 端口)、时间戳以及服务端在验证令牌有效时需要的任何信息。
    

    8.2. Path Validation

      在连接迁移(详见 9.6 小节)的时候正在迁移的一端会使用路径有效性来确认一个新的本地地址到对端
    的可达性。在路径有效性验证中,端点会测试一个特定的本地地址与一个特定的对端地址的可达性,地址
    是 IP、端口的两元组。
      
      路径有效性会测试能发送包到对端并且能从对端收到包。重要的是,它会验证从迁移端收到的包没有携
    带伪造的源地址。
    
      任何一端都可以在任何时候验证路径有效性,比如,一个端点可以检查对端在一段静默期后是否仍然
    是它原来的地址。
    
      路径有效性并不是被设计为一种 NAT 的穿透机制,尽管路径有效性对于建立支持穿透的 NAT 绑定来
    说是高效的,但预期是对端在没有先发送包的情况下可以收到包。高效的 NAT 穿透需要额外的同步机
    制,而这种机制在这里并没有提供。
    
      端点可以把 PATH_CHALLENGE 和 PATH_RESPONSE 帧与其他帧组合发送。特别地,端点可以填
    充携带 PATH_CHALLENGE 帧的包来发现 PMTU,也可以将 PATH_RESPONSE 与它自己的 
    PATH_CHALLENGE 组合发送。
    
      当探测新的路径的时候,端点希望保证对端有一个没有使用的连接 ID 来发送响应。端点可以在同一个
    包中发送 NEW_CONNECTION_ID 和 PATH_CHALLENGE 帧,这可以保证对端有一个未使用的连接
    ID 用于发送响应。
    

    8.3. Initiating Path Validation

      端点在被验证的路径上发送包含一个随机值的 PATH_CHALLENGE 帧来验证路径的有效性。
      
      端点可以发送多个 PATH_CHALLENGE 帧确保被送达对方,然而,端点不应该在同一个包中发送多个
    PATH_CHALLENGE 帧。端点也不应以高于 Initial 的频率发送 PATH_CHALLENGE 帧,这样可以确保
    连接迁移不会在新路径上增加连接建立的成本。
    
      端点必须在每一个 PATH_CHALLENGE 帧中使用不可预测的数据,从而可以将 PATH_CHALLENGE 帧
    与对端的响应关联起来。
    

    8.4. Path Validation Responses

      在收到 PATH_CHALLENGE 帧时,端点必须立即通过 PATH_RESPONSE 帧回显 PATH_CHALLENGE 
    帧中的数据。
      端点最多可以为每一个 PATH_CHALLENGE 帧响应一个 PATH_RESPONSE 帧(详见 13.3 小节)。
    对端发送多个 PATH_CHALLENGE 帧是为了确保可以收到 PATH_RESPONSE 帧。
    

    8.5. Successful Path Validation

      一个新的地址只有在收到 PATH_RESPONSE 帧时被认为是有效地,且该帧必须包含之前 
    PATH_CHALLENGE 帧的数据。收到包含 PATH_CHALLENGE 帧的包的确认并不足以证明路径有效,
    因为这个确认可以被一个恶意的端点伪造。
    

    8.6. Failed Path Validation

      验证路径有效只有在尝试验证的一方主动放弃时才会失败。
    
      端点应该基于定时器来主动放弃验证路径有效,在设置这个定时器时,实现需要考虑到新的路径的 RTT 可
    能比原来路径的长,建议设为当前 PTO 三倍大小的值与 QUIC-RECOVERY 中定义的初始超时值
    (2*kInitialRtt)的较大值,即:
       validation_timeout = max(3*PTO, 6*kInitialRtt)
     注意,端点可以在新的路径接收包含其他帧的包,但为了成功验证路径有效,PATH_RESPONSE 帧以及合
     适的数据是需要的。
    
      当端点主动放弃验证路径有效时,即认为该路径不可用。这不一定意味着是一个连接失败,端点可以继续
    在其他路径发送包。如果没有可用的路径,端点可以等待直到有一个新路径可用,或者关闭连接。
      
      除了失败还有其他原因导致放弃验证路径有效。主要是当一个连接开始迁移到新的路径时,一个旧路径有
    效性的验证正在处理。
    

    相关链接

    QUIC-RECOVERY

    展开全文
  • 3. Validation, Data Binding, and Type Conversion 3.1. Introduction JSR-303 / JSR-349 Bean验证 Spring Framework 4.0在安装支持方面支持Bean Validation 1.0(JSR-303)和Bean Validation 1.1(JSR-349...
  • Laravel开发-validation

    2019-08-28 05:01:27
    Laravel开发-validation 扩展验证器:Laravel4的图像和翻译
  • 介绍: 这节教程我们将探索Struts2来确认用户表单上的输入信息这是有2种方式的,这节我们将更加深入了解在struts2 的action class更加基础的方法。(第一种方法) ...那我们如何提示返回给他们呢?...
  • <div><p>validation组件添加缺少的翻译项:gt,gte,ipv4,ipv6,lt,lte,mimetypes,not_regex,starts_with,uuid</p><p>该提问来源于开源项目:hyperf/hyperf</p></div>
  • AngularJS form validation-表单验证

    万次阅读 2014-01-05 23:57:40
    angularjs form validation 表单验证 翻译
  • 尊重/验证翻译 安装 composer require t0mmy742/respect-validation-translation 用法
  • <pre><code>$ip = "::ffff:0:10.0.0.3"; if (!filter_var($ip, FILTER_VALIDATE_IP) === false) { echo("$ip is a valid IP address"); ... echo("$ip is not a valid IP address");...<p>this return invalid ...
  • jQuery Validate插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供...所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言 作为一个标准的验证方法库,Validation拥有以下特点...
  • Validation文档翻译 前言 Validation作为表单验证中最常用的插件,为我在开发过程中提供了很多便利的地方。虽然说我很常用,但是我真的不敢说我会用Validation。每次使用都是在菜鸟教程上粘贴代码,修改rule就这么用...
  • spring4.0整合了validation验证功能

    万次阅读 2016-03-25 13:53:42
    今天翻译博客时 无意中发现的小知识点, 源地址:http://jinnianshilongnian.iteye.com/blog/1990081?page=2#comments Bean Validation 1.1当前实现是Hibernate validator 5,且spring4才支持。接下来我们从以下...
  • Jquery Validation表单验证 & 手机号验证

    千次阅读 2018-04-16 16:25:03
    Jquery Validation简介Jquery Validation插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件...
  • JSR 303是Java EE 6中的一项子规范,叫做Bean Validation,官方参考实现是hibernate Validator,此实现与Hibernate ORM没有任何关系。JSR 303用于对Java Bean中的字段的值进行验证。 本教程翻译自Hibernate ...
  • jQuery.validationEngine v3.1.0 寻找官方贡献者 这个项目已经进行了7年多了,现在我仅通过请求请求的贡献来维护该项目。 但是,我很乐意帮助提高代码质量并保持可接受的未解决问题。 概括 jQuery验证引擎是一个...
  • 环境mongodb:3.4该功能是从mongodb版本 3.2开始支持的.@author 喻涛概述本篇由本人翻译官方文档: https://docs.mongodb.com/manual/core/document-validation/Mongodb提供了在插入和更新时验证文档的功能.验证规则...
  • 所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言。该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 ...
  • 我觉得翻译成java请求约束更好听点 JSR303: @Null,@NotNull,@Pattern JSR349:是JSR的升级版,只是约束,没有实现 真正实现约定的技术 hibernate vildation 实现了jsr的约定 spring ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 202
精华内容 80
关键字:

validation翻译