2015-10-23 38 views
12

Trang web của tôi đang tăng ngoại lệ khoảng 20 lần mỗi ngày, thường biểu mẫu hoạt động tốt nhưng có trường hợp xảy ra sự cố này và tôi không biết tại sao lại ngẫu nhiên như vậy .Cookie chống giả mạo "__RequestVerificationToken" không có mặt

này được đăng nhập ngoại lệ bởi ELMAH

500 HttpAntiForgery Các yêu cầu chống giả mạo Cookie __RequestVerificationToken" là không có mặt.

Nhưng hình thức nó được gửi token như hiển thị trên XML log by elmah

<form> 
    <item name="__RequestVerificationToken"> 
     <value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/> 
    </item> 
    <item name="toPhone"> 
     <value string="XXXXXX"/> 
    </item> 
    <item name="smsMessage"> 
     <value string="xxxxxxxx"/> 
    </item> 
</form> 

Đây là phương pháp của tôi trên bộ điều khiển sử dụng dữ liệu Thuộc tính để kiểm tra xem mã thông báo có vali hay không d hoặc cũng không

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<JsonResult> Send(SMSModel model) 
{ 
    // my code goes here 
} 

Đây là hình thức của tôi về quan điểm

@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" })) 
{ 
    @Html.AntiForgeryToken() 
    <div class="row"> 
     <div class="col-md-12"> 
      <div class="form-group"> 
       <div class="input-group"> 
        <div class="input-group-addon">+53</div> 
        @Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 }) 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group" style="position:relative"> 
     <label class="sr-only" for="exampleInputEmail3">Message (up to 135 characters)</label> 
     @Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" }) 
     <span class="char-count">135</span> 
    </div> 
    if (ViewBag.Sent == true) 
    { 
     <div class="alert alert-success alert-dismissible" role="alert"> 
      <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
      <strong>Su mensaje ha sido enviado <span class="hidden-xs">satisfactoriamente</span></strong> 
     </div> 
    } 
    if (ViewBag.Error == true) 
    { 
     <div class="alert alert-danger alert-dismissible" role="alert"> 
      <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
      <strong>Error:</strong> Por favor revise el número de teléfono. 
     </div> 
    } 
    <div class="errorToMany"></div> 
    <button type="submit" class="btn btn-default btn-block">Enviar SMS</button> 
} 

Và cách này tôi gửi dữ liệu của tôi sử dụng AJAX

$('form.form-sms').submit(function (event) { 
    $.ajax({ 
     url: $(this).attr("action"), 
     type: "POST", 
     data: $(this).serializeArray(), 
     beforeSend: function (xhr) { 
      $('.btn-default').attr("disabled", true); 
      $('.btn-default').html("Enviando...") 
     }, 
     success: function (data, textStatus, jqXHR) { 
      if (data[0] == false && data[1] == "1") { 
       some code 
      } else { 
       location.reload(); 
      } 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { } 
    }); 
    return false; 
}); 

Các hình thức hoạt động tốt thời gian nhất nhưng lỗi này giữ xảy ra và tôi không biết tại sao, tôi đã kiểm tra các câu hỏi khác ở đây trên Stack Overflow nhưng không có gì làm việc cho tôi.

Để được giải thích thêm về cách tôi đăng dữ liệu.

Biểu mẫu này để gửi SMS có các trường ToNumber và Message. Khi người dùng nhấp vào nút gửi, chức năng AJAX kiểm soát và đăng nó tuần tự hóa dữ liệu trường của biểu mẫu, khi chức năng của tôi trong bộ điều khiển kết thúc và trả về kết quả JSON cho thấy mọi thứ diễn ra tốt đẹp, phương pháp AJAX sẽ tải lại trang hiển thị người dùng thành công thông điệp.

Bất kỳ ý tưởng nào có thể gây ra sự cố này.

Trả lời

15

Có vẻ như mọi thứ đang hoạt động như mong đợi.

Cách trình trợ giúp chống giả mạo @Html.AntiForgeryToken() hoạt động bằng cách tiêm một trường biểu mẫu ẩn có tên là __RequestVerificationToken vào trang VÀ nó cũng đặt cookie vào trình duyệt.

Khi biểu mẫu được đăng lại, hai biểu mẫu được so sánh và nếu chúng không khớp hoặc cookie bị thiếu thì lỗi được đưa ra.

Vì vậy, không quan trọng là Elmah ghi lại biểu mẫu đang gửi __RequestVerificationToken. Nó sẽ luôn luôn, ngay cả trong trường hợp tấn công CSRF, bởi vì đây chỉ đơn giản là trường biểu mẫu ẩn.

<input name="__RequestVerificationToken" type="hidden" value="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41" /> 

Các thông báo lỗi trên Mặt khác nói COOKIE tương ứng không được gửi:

500 HttpAntiForgery Các yêu cầu chống giả mạo Cookie __RequestVerificationToken" là không có mặt.

Vì vậy, về cơ bản ai đó/cái gì đó đang phát lại bài đăng biểu mẫu mà không đưa ra yêu cầu ban đầu để lấy cookie. Vì vậy, họ có trường biểu mẫu ẩn __RequestVerificationToken nhưng KHÔNG phải cookie để xác minh.

Vì vậy, có vẻ như mọi thứ đang hoạt động như mong muốn. Kiểm tra lại nhật ký của bạn: số IP và liên kết giới thiệu, v.v. Bạn có thể bị tấn công hoặc có thể đang làm điều gì đó lạ hoặc lỗi khi chuyển hướng nội dung biểu mẫu của bạn. Như trên, referrers là một nơi tốt để bắt đầu cho loại lỗi này, giả sử điều này không bị giả mạo.

Cũng lưu ý rằng theo MDN

location.reload(); 

Phương pháp Location.reload() tải lại tài nguyên từ URL hiện tại. Tham số duy nhất tùy chọn của nó là một Boolean, khi nó là đúng, làm cho trang luôn được tải lại từ máy chủ. Nếu đó là sai hoặc không được chỉ định, trình duyệt có thể tải lại trang từ bộ nhớ cache.

Nếu thỉnh thoảng tải từ bộ nhớ cache, bạn có thể kết thúc bằng POST có mã thông báo trang cũ chứ không phải cookie.

Vì vậy, hãy thử:

location.reload(true); 
+0

Man, cảm ơn bạn đã giải thích chi tiết, tôi không biết mẹo location.reload (true). Tôi chỉ cần thay đổi mã của tôi và sẽ chờ đến ngày mai để xem nếu không nhận được vấn đề này nữa và sẽ đánh dấu câu trả lời của bạn là chấp nhận nếu đó là trường hợp. –

4

Ngoài câu trả lời tuyệt vời rism của, một lý do khác có thể cho gặp phải lỗi này là bởi vì trình duyệt của bạn, hoặc plugin trình duyệt chặn đặt cookie.

0

Có thể muốn xem câu hỏi này. The anti-forgery cookie token and form field token do not match in MVC 4

Có thể đây là vấn đề thời gian chờ. Về cơ bản khi thời gian chờ xảy ra, cookie không được lưu trữ vì người dùng iis mà trang web đang chạy không có quyền truy cập thích hợp. Đối với tôi, tôi đã thay đổi hồ bơi ứng dụng để tải hồ sơ người dùng và điều này dường như khắc phục.

2

Đã gặp sự cố tương tự gần đây. Các chống giả mạo cookie sẽ thực sự là mất tích, như vậy (như những người khác chỉ ra) hoặc

  1. máy chủ không thêm cookie để yêu cầu, hoặc
  2. trình duyệt từ chối nó.

Trong trường hợp của tôi, đó là máy chủ: Tôi đã không sử dụng SSL trên môi trường địa phương, nhưng trong web.config tôi đã có dòng sau:

<httpCookies requireSSL="True"/> 

Giải pháp trong trường hợp này là một trong hai chuyển sang SSL hoặc giữ giá trị được đặt thành 'False' cho môi trường cục bộ.

+1

Trong trường hợp của chúng tôi, chúng tôi đã gặp sự cố khi chuyển đổi giữa các dự án localhost nơi một số * là * SSL và một số * không * SSL – RhysW

Các vấn đề liên quan