CSRF (Cross-site isteği sahtekarlığı) saldırı örneği ve PHP önleme

4 Cevap php

Ben insanlar böyle bir oylamayı yerleştirebilirsiniz bir web sitesi var:

http://mysite.com/vote/25

Bu benim sadece kayıtlı kullanıcılar için bu geçerli yapmak istiyorum. Öğe 25 bir oy yerleştirin ve bunda yapmak istiyorum yalnızca. Şimdi birileri sitesinde meşgul olduğunda biliyorum, birileri onlara böyle bir bağlantı verir:

http://mysite.com/vote/30

sonra oy ona bunu yapmak isteyen olmadan öğe onun için yerler olacak.

Ben explanation on the OWASP website okudum, ama ben gerçekten anlamıyorum

Bu CSRF bir örnektir, ve bunu nasıl önleyebilirsiniz. I kapalı aklınıza gelebilecek en iyi şey, bir karma gibi linke şey ekliyor. Ama bu tüm bağlantıların ucunda bir şey koymak için oldukça rahatsız edici olacaktır. Bunu yapmanın başka bir yolu var mı.

Web sitesi bana oldukça füg gibi görünüyor, çünkü başka bir şey birisi, belki bana bu diğer bazı örnek verebilirim.

4 Cevap

Bu CSRF bir örnek haline gelebilir:

  • bu bağlantı getirilen (via an <img> etiketi, örneğin) : 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.

İlk olarak, istek, sunucuda durumları değiştirmek için kullanılmamalıdır GET, bu nedenle oy servis için ben POST / PUT öneriyoruz. Bu yalnızca bir kılavuz ama satır biridir.

So to your question, CSRF is a client issue so it doesn't matter what kind of server language you use (PHP in your case). The standard fix is the same and goes like this: Have a random value in the URI/POST-data and the same value in the Cookie header. If those matches you could be sure there is no CSRF. There are a lot of info about how this could be done here on StackOverflow eg. this one.
Good luck!

> UltimaBB - -> GaiaBB OWASP ben XMB için uzun bir süre önce yazdığı bir PHP için CSRFGuard ve PHP için ESAPI vardır.

http://code.google.com/p/gaiabb-olpc/source/search?q=function+get_new_token&origq=function+get_new_token&btnG=Search+Trunk

Bu bazıları bu kodu temizlenmiş ve güçlü belirteçleri için izin var gibi görünüyor:

https://www.owasp.org/index.php/PHP_CSRF_Guard

thanks, Andrew