Bu CSRF bir örnek haline gelebilir:
- bu bağlantı getirilen (via an
<img>
etiketi, örneğin) em>: sahtecilik
- cross-site: Başka bir siteden
For example, if I could inject this <img>
tag in the HTML source-code of stackoverflow (and I can, as stackoverflow allows one to use <img>
tags in his posts) :
<img src="http://mysite.com/vote/30" />
Sadece bu anket için oy olurdu ;-)
The solution that is generally used is to place a token, that has a limited life-time, in the URL, and, when the URL is fetched, check that this token is still valid.
Temel fikir olacaktır:
- When generating the page :
- benzersiz bir belirteç oluşturmak
- Bu kullanıcının oturumunda depolamak
- ve sayfa bağlantıları yerleştirin - Bu gibi görünür hangi:
http://mysite.com/vote/30?token=AZERTYUHQNWGST
- When the voting page is called :
- Belirteci URL mevcut olup olmadığını kontrol edin
- Bu kullanıcının oturumunda mevcut olup olmadığını kontrol
- Değil => oy kayıt yoksa
Fikir var:
- Belirteçleri uzun bir yaşam süresi var, ve tahmin etmek zor değil
- Which means your attacker :
- Onun enjeksiyon geçerli olacak sırasında bir kaç dakika sadece bir penceresi vardır
- ^ ^ tahmin de iyi olmak zorunda olacak
- her kullanıcı için farklı bir sayfa oluşturmak gerekir.
Also, note that the shorter the user's session remains active after he has left your site, the less risks there are that it's still valid when he visits the bad website.
Ama burada, güvenlik ve kullanıcı-dostu arasında seçim yapmak zorunda ...
Another idea (that's not perfectly secure, but helps against guys would don't know how to force a POST request), would be to only accept POST requests when people are voting :
- Tarayıcı enjekte etiketleri için GET istekleri gönderiyor
- Bu URL zaten bazı verileri değiştirme gibi, bu GET ile çalışmak, ama olmamalı sadece POST ile
Ama bu tamamen güvenli olmadığını unutmayın: bu Javascript bazı bit ile, bir POST isteği oluşturmak / zorlamak için (probably ? ) mümkün.