2013-05-17 20 views
5

Angular sets the X-XSRF-TOKEN header to the value of the XSRF-TOKEN cookie:Tại sao AngularJS gửi tiêu đề X-XSRF-TOKEN dưới dạng chuỗi JSON?

var xsrfValue = isSameDomain(config.url, $browser.url()) 
       ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] 
       : undefined; 
if (xsrfValue) { 
    headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; 
} 

Nhưng, nếu một thiết lập XSRF-TOKEN Cookie sử dụng $cookieStore (đối với Rails tích hợp, ví dụ):

$cookieStore.put("XSRF-TOKEN", "my_token"); 

the cookie is stored as JSON string:

put: function(key, value) { 
    $cookies[key] = angular.toJson(value); 
} 

này có nghĩa là tiêu đề sẽ có thêm dấu ngoặc kép:

X-XSRF-TOKEN "my_token" 

Tại sao góc không gọi fromJson() khi nó đặt giá trị của tiêu đề để các tiêu đề sẽ trông như thế này:

X-XSRF-TOKEN my_token 

?

Điều đó sẽ giúp chúng tôi xóa các dấu ngoặc kép thêm ở phía máy chủ.

Tôi có thiếu điều gì đó hiển nhiên ở đây không?

Lưu ý: Tôi không tìm cách giải quyết. Tôi đang cố gắng để hiểu liệu hành vi này là hành vi dự định, và nếu có, lý do là gì?

+0

Tôi không biết nếu đó là hành vi dự định, nhưng nó có thể có một tác dụng phụ rất mong muốn của việc ngăn chặn mã thông báo XSRF không bị nhận dạng khi nhận được dưới dạng cookie. Sau khi tất cả, CSRF hoạt động cụ thể bởi vì trình duyệt gửi cookie của họ với tất cả các yêu cầu, do đó, mã thông báo bị đặt nhầm chỗ trong cookie không thể đọc chính xác sẽ giúp ngăn tình cờ vô hiệu hóa việc bảo vệ. – atk

Trả lời

8

Here is the official answer I got:

Vấn đề thực sự ở đây là bạn đang cố gắng sử dụng $ cookieStore với mục đích sai. $ CookieStore là một trừu tượng trên đầu trang của $ cookie, hoạt động với các đối tượng và tuần tự hóa chúng thành JSON. Nếu bạn muốn chỉ định mã thông báo XSRF thì chỉ cần sử dụng $ cookie để viết mã, trong đó hoạt động trực tiếp với chuỗi.

Nói cách khác, ta nên làm:

$cookies["XSRF-TOKEN"] = "my_token"; // Stored as: my_token

hơn:

$cookieStore.put("XSRF-TOKEN", "my_token"); // Stored as: "my_token"

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