2013-01-01 18 views
27

AngularJS Rails ile kullanıyorum. Kullanıcıları toplu olarak güncelleyen aşağıdaki isteğim var.Köşeli JS POST İsteğinde CSRF Simgesini Doğrulama

$http{ 
    method: 'POST', 
    url: $scope.update_url, 
    params: {selected_ids: userIds} 
} 

Bu 'GET' isteği olamaz nedeniyle URL'ye (http://support.microsoft.com/kb/208427) uzunluğunda kısıtlamalara

Ama 'POST' talebi için

, başlıkta bir CSRF özgünlük belirtecine sahip olmamız gerekiyor.

CSRF Token'i posta isteği üstbilgisine nasıl ayarlayabiliriz?

cevap

65

0 başlıklarını $http hizmetinde açıklanan şekilde ayarlayabilirsiniz.

Sen global olarak ayarlayabilirsiniz:

$httpProvider.defaults.headers.post['My-Header']='value' (or) 
$http.defaults.headers.post['My-Header']='value'; 

ya da tek bir istek için

:

xsrf (: İşte

$http({ 
    headers: { 
     'My-Header': 'value' 
    } 
}); 

Angular gelen önemli bir alıntı XSRF) Koruma XSRF, yetkisiz bir sitenin kullanıcı priva'larını kazanabileceği bir tekniğidir. Veri. Açısal , XSRF'ye karşı aşağıdaki mekanizmayı sağlar. XHR istekleri gerçekleştirilirken, $ http hizmeti XSRF-TOKEN adlı bir çerezden bir jetonu okur ve bunu X-XSRF-TOKEN HTTP başlığı olarak ayarlar. Sadece alanınızda çalışan javascript çerezleri okuyabildiğinden, sunucunuz , XHR'nin etki alanınızda çalışan JavaScript’ten geldiğinden emin olabilirsiniz.

Bunun avantajından yararlanmak için sunucunuzun, ilk HTTP GET isteği üzerine XSRF-TOKEN adlı JavaScript tarafından okunabilir bir oturum çerezinde bir belirteç belirlemesi gerekir. Sonraki GET olmayan isteklerde sunucu, çerezi X-XSRF-TOKEN HTTP üstbilgisiyle eşleştiğini doğrulayabilir ve bu nedenle, yalnızca alan adınızda çalışan JavaScript'in belirtecini okuyabildiğinden emin olun. belirteci her kullanıcı için benzersiz olmalıdır ve sunucusu tarafından doğrulanabilir olmalıdır (JavaScript'in kendi belirteçlerini oluşturmasını önlemek için). , belirtecin ek güvenlik sağlamak için sitenizin kimlik doğrulaması çerezinin bir özetini tavsiye etmesini öneririz.

+0

Teşekkürler! CSRF-Token ayarlandı olarak bir posta isteği için doğru yolu bu mu? Veya gizli bir form oluşturmalı ve formu ng-click() üzerinde studentIds ile mi göndermeliyim? Ama bu durumda, yanıt verisini nasıl alabilirim? Tekrar teşekkürler! –

+0

Açısaldan bir alıntı ekledim. – asgoth

+2

Bu çözümün neden Angular'ın belgelerine uygun olduğu konusunda net değilim. Dokümanlar, bir çerez belirlemeniz gerektiğini bildirir, ancak üstbilgiyi manuel olarak ayarlıyor gibi görünüyorsunuz. – RevNoah

0

Geçenlerde aynı sorunu ve angular_rails_js Çözmedim mücevher ekleyerek karşılaştığı bir uygulama vardır. Anladığım kadarıyla, her ray için, CSRF-TOKEN ile açısal $ http tarafından yakalanacak (varsayılan $ http davranışı) rayları içeren bir çerez denetler.

İlgili konular