代码之家  ›  专栏  ›  技术社区  ›  Max

Dotnet核心Web API无意中逃脱倒退

  •  0
  • Max  · 技术社区  · 5 年前

    我有一个端点,它接受json数据 currentPassword , newPassword newPasswordConfirmation .

    我遇到了一个问题,因为我想接受字面上的反斜杠( \ )在密码中,它们必须被传入,但它们会通过Web API验证进行转义。

    我想我在C#类中缺少so属性,但我还没有找到。

    请求:

    curl -X POST "https://localhost:44343/1/NO/User/123/Password/Change" -H "accept: application/json" -H "X-Api-Key: secret-key" -H "Content-Type: application/json" -d "{ \"currentPassword\": \"bla\hej\.%", \"newPassword\": \"blabla\", \"newPasswordConfirmation\": \"blabla\"}"
    

    答复:

    {
      "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
      "title": "One or more validation errors occurred.",
      "status": 400,
      "traceId": "|3876e18a-40326202f78c6022.",
      "errors": {
        "$.currentPassword": [
          "'h' is an invalid escapable character within a JSON string. The string should be correctly escaped. Path: $.currentPassword | LineNumber: 1 | BytePositionInLine: 26."
        ]
      }
    }
    

    模型I反序列化为 :

        public class BasePasswordModel
        {
            [Required]
            public string NewPassword { get; set; }
            [Required]
            public string NewPasswordConfirmation { get; set; }
        }
    
        public class ChangePasswordModel : BasePasswordModel
        {
            [Required]
            public string CurrentPassword { get; set; }
        }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Karney.    5 年前

    如果在密码中接受文字反斜杠(\),则需要使用

    \\  (Backslash character)
    

    其他特殊字符

    \b  Backspace (ascii code 08)
    \f  Form feed (ascii code 0C)
    \n  New line
    \r  Carriage return
    \t  Tab
    \"  Double quote
    

    然后后端可以接收双反斜杠,因为反斜杠的特殊性,它必须成对出现。数据库中的反斜杠在变为字符串后可以直接进行比较。


    另一种方法是将数据放入 表单数据 ,它可以将所有特征系列化。

    public IActionResult change([FromForm]ChangePasswordModel changePasswordModel)
        {
            //...
            return Ok(changePasswordModel);
        }