Orijinallik belirteci, Siteler Arası İstek Sahteciliği saldırılarını (CSRF) önlemek için kullanılır. Orijinallik belirtecini anlamak için önce CSRF saldırılarını anlamalısınız.
CSRF
Diyelim ki yazar sizsiniz bank.com
. Sitenizde, bir GET isteğiyle farklı bir hesaba para aktarmak için kullanılan bir formunuz var:
Bir bilgisayar korsanı sunucuya HTTP isteği gönderebilir GET /transfer?amount=$1000000&account-to=999999
, değil mi?
Yanlış. Bilgisayar korsanlarının saldırısı çalışmaz. Sunucu temel olarak düşünecek mi?
Ha? Bu adam kim bir transfer başlatmaya çalışıyor. Hesabın sahibi değil, kesinlikle.
Sunucu bunu nasıl biliyor? Çünkü session_id
istekte bulunanın kimliğini doğrulayan bir çerez yok .
Kullanıcı adınız ve şifrenizle oturum açtığınızda, sunucu session_id
tarayıcınıza bir çerez yerleştirir. Bu şekilde, her isteği kullanıcı adınız ve şifrenizle doğrulamanız gerekmez. Tarayıcınız session_id
çerezi gönderdiğinde , sunucu şunları bilir:
Oh, bu John Doe. 2.5 dakika önce başarıyla giriş yaptı. Gitmek güzel.
Bir hacker şöyle düşünebilir:
Hmm. Normal bir HTTP isteği işe yaramaz, ancak elimi bu session_id
çerezden alabilirsem altın olurdum.
Kullanıcı tarayıcısında, alan bank.com
adı için bir grup çerez ayarlanmıştır . Kullanıcı alan adına her istekte bulunduğunda bank.com
, tüm çerezler gönderilir. session_id
Çerez dahil .
Dolayısıyla, bir hacker sizi hesabına para transfer eden GET talebinde bulunabilseydi, başarılı olurdu. Sizi nasıl kandırdı? Siteler Arası Talep Sahteciliği.
Aslında oldukça basit. Bilgisayar korsanı web sitesini ziyaret etmenizi sağlayabilir. Web sitesinde aşağıdaki resim etiketine sahip olabilir:
<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">
Kullanıcıların tarayıcısı bu resim etiketine rastladığında, bu URL'ye bir GET isteği gönderir. Ve istek tarayıcısından geldiğinden, onunla ilişkili tüm çerezleri gönderir bank.com
. Kullanıcı yakın zamanda oturum açtıysa bank.com
... session_id
çerez ayarlanacak ve sunucu kullanıcının 999999 hesabına 1.000.000 dolar aktarmak istediğini düşünecektir!
Tehlikeli siteleri ziyaret etmeyin ve iyi olacaksınız.
Bu yeterli değil. Birisi bu resmi Facebook'a gönderir ve duvarınızda görünürse? Ya bir XSS saldırısıyla ziyaret ettiğiniz bir siteye enjekte edilirse?
O kadar da kötü değil. Yalnızca GET istekleri savunmasızdır.
Doğru değil. POST isteği gönderen bir form dinamik olarak oluşturulabilir. İşte Rails Guide of Security'den örnek :
<a href="http://www.harmless.com/" onclick="
var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = 'http://www.example.com/account/destroy';
f.submit();
return false;">To the harmless survey</a>
Orijinallik Simgesi
Bunu yaptığınızda ApplicationController
:
protect_from_forgery with: :exception
Bu:
<%= form_tag do %>
Form contents
<% end %>
Bu derlendi:
<form accept-charset="UTF-8" action="/" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
Form contents
</form>
Özellikle, aşağıdakiler üretilir:
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
CSRF saldırılarına karşı korunmak için, Rails bir istekle birlikte gönderilen özgünlük belirtecini görmezse, isteği güvenli kabul etmez.
Saldırganın bu tokenin ne olduğunu nasıl bilmesi gerekir? Form her oluşturulduğunda rastgele farklı bir değer oluşturulur:
Siteler Arası Komut Dosyası Oluşturma (XSS) saldırısı - işte böyle. Ancak bu, farklı bir gün için farklı bir güvenlik açığıdır.