Referer'a ile PHP Form Güvenlik

7 Cevap php

Ben kullanıcı girişi için kendisini hazır hale getirecek bir site kuruyorum. Gibi bir işlevi yazma merak ediyordum:

if(getenv("HTTP_REFERER") != 'http://www.myURL.com/submitArea'){
        die('don\'t be an jerk, ruin your own site');   
    }else{
        // continue with form processing    
    }

çapraz site form gönderimleri önlemek için yeterli değildir.

EDIT: Ve değilse, ne diğer bilgisayarlardan gelen sunulmadan formları önlemek için en iyi yöntem nedir?

7 Cevap

Aslında evet, OWASP CSRF Prevention Cheat Sheet çoğu referer kontrol için uygun bir CSRF açığı yama için yeterlidir. Üzerinde referer aldatmak için önemsiz olsa da sizin OWN BROWSER o (CSRF üzerinden) impossible başka tarayıcınızda parodi olduğu için breaks the rules.

Aslında referer kontrol Bellek kıt tümleşik ağ donanım üzerinde görmek çok yaygındır. Motorola, Sörf tahtası Kablo Modemler için yapar. Çünkü I hacked them with csrf Ben, bu ilk elden biliyorum ve daha sonra bir referer çek kullanarak yamalı. Bu güvenlik açığı, 13,5 şiddeti metrik alınan ve İç Güvenlik Bakanlığı'na göre, bu en tehlikeli CSRF açığı şimdiye kadar keşfedilen ve tüm zamanların en iyi 1000 en tehlikeli yazılım kusurları bulunmaktadır.

Hayır - HTTP_REFERER serbestçe istemci tarafında sahte bir istek nereden geldi güvenilir bir gösterge değildir olabilir.

Update: Ben çapraz site sahtecilik hakkında kısmını oynanırsa: Bunun için, CSRF korumalı sayfalara işaret manipüle bağlantıları güveniyor çünkü referer is geçerli bir güvenlik önlemi, kontrol (saldırdı kullanıcının sahip olduğunu ) imtiyazlar. Rook @ kullanıcı doğrudur.

Saldırı saldırıya ediliyor web uygulama içinde gerçekleşmesi, örneğin eğer tek istisnası zararlı JavaScript kodu enjekte ederek. Saldırı bir "güvenli" URL, but so is arguably a solution based on a session or one-time token geliyor çünkü belirteç zararlı JavaScript ulaşmak ve kolayca alınabilir, çünkü bu durumda, bir referer çek, işe yaramaz.

Ancak, bir kerelik belirteci kullanarak HTTP_REFERER, bazı vekiller ile çıkarılır çünkü saldırıların bu tür karşı korumak için oldukça tercih edilir.

Bir OTURUMU kullanarak en olası çapraz site form gönderimleri önlemek için daha iyi bir yol olacaktır.

Bu imkansız iken spoof bir Referer başka bir kullanıcının tarayıcısında, bazı ek olarak, (bir meta-refresh kullanarak örneğin) bir eksikliği-of-yönlendirme parodi kolay kullanıcı-ajanlar hiç bir Referer göndermiyor.

Yani eksik-yönlendirme sağlayan ve non-su geçirmez XSRF koruma var, ya da erişilebilirlik için büyük bir darbe vuracaktır durumda sitenizi, maçlar sen require bir yönlendirme. Komut dosyası kullanan tek kişi ise bu hit kabul olabilir, ve size her zaman güvenilir aracılığıyla yönlendirmeleri geçen bir tarayıcı / güvenlik duvarı / vekil / etc kombinasyonu kullanarak olacak biliyorum. Ama diğer insanlar kullanmak için bekledikleri şey için, genellikle iyi bir fikir değil.

Referer oldukça zayıf bir anti-XSRF mekanizmadır. Çok daha iyi sunulması doğrulamak için sunucuya geri gelmelidir sunucusu tarafından verilen bir per-user/event belirteç kullanmak.

$ Sorgu = "* users {FROM [(1)]} = '$ isim' SELECT";

Potansiyel SQL injection açığı. Lütfen mysql_real_escape_string veya parametreleri sorgular.

input.setAttribute ('isim', 'add_bar');

input.setAttribute ('değer','');

setAttribute HTML niteliklerini kullanmayın. Bazı durumlarda çalışan durdurmak IE hatalar vardır ve ne düşündüğünüzü yapmazsanız bazı özellikler vardır. Örneğin, value özniteliği ayarını value özellik ayar olarak not aynıdır. Özelliği form alanının geçerli değerini tutar; niteliği yalnızca bir <input type="reset"> kullanıldığı takdirde reset edileceği alanın 'varsayılan değer', tutar. Bu defaultValue mülkiyet eşler. Bazı tarayıcılarda, varsayılan değer ayarlayarak da değerini ayarlar, ancak bu standart dışı ve güvenerek alınmamalıdır.

DOM Seviye 1 HTML özelliklerini kullanın, her ikisi de daha okunabilir ve daha güvenilir konum:

input.name= 'add_bar';
input.value= <?php echo json_encode(generate_session_token(), JSON_HEX_TAG); ?>;

json_encode JavaScript sayılların değerleri oluşturmak için kullanın. Emin olmasına rağmen bir MD5-sum {[(4 biter ' veya \, ya da </ dizisi gibi JS özel karakterleri içermez )]}, bu oturum belirteci içerebilir bilmek çıkış şablonun işi blok]} argüman koruyor ({[(5 kendisine karşı)) değil. Bu çıkış için güvenli bir yoldur, bir <script> bloğunun içine herhangi bir dizedir.

this question oturumu veya veritabanında hiçbir ekstra token-depolama gerektirir anti-XSRF belirteçleri üreten bir yaklaşım için bkz.

Yes, it's secure

Ne yazık ki, holy text (ama hala bir yönlendirme ne kendi mekanizması icat edemez) disable yönlendirme için bir seçenek sunmak için teşvik eder; o yüzden aslında, birisi böylece kendini sitenize erişim inkar, onun tarayıcınızda yönlendirmeleri devre dışı bırakabilir.

Sizin çözüm güvenli, ancak sitenizin sadece etkin yönlendirmeleri ile çalışır eğer kullanıcıların meşru şikayette bulunabilirsiniz.

Şimdi sitenizin CSRF karşı güvenli değildir sağlamak için hiçbir sane yol var demektir, çünkü bu çok üzücü.

Alternative

Gerçekten yapabileceğiniz tek şey, web servisine, her doğrulanmış isteği bir nonce konur. Eğer web hizmeti emin every isteği noktası seferlik doğrular yapmak zorunda çünkü bu ancak biraz tehlikeli. Ancak, biraz bu sıkıntıdan migitate için, sizin için bunu yapmak için bir çerçeve kullanabilirsiniz. Yığın taşması kendisi Nonce'lar kullanıyor gibi görünüyor.

However

Sadece yönlendirme aynı etki olmadığı sürece hiçbir isteği yer alabilir diyor küresel bir kuralı uygulamak, çünkü prensipte referanslar biraz daha güvenli. Eğer yönlendirmeleri devre dışı kullanıcılara damla istekli iseniz, bu kabul edilebilir.

Insanlar burada ne diyorsun saçma aksine, can't ayrıcalıklı olmayan tarayıcı kod sahte bir başlık ile bir HTTP isteği. Beklendiği gibi, Flash yönlendirme dayanan anti-CSRF atlamak için bir kez bunu başardı, ama o yamalı oldu. Neden yamalı oldu? HTTP RFC böylece yönlendirme ne belirler, çünkü müşteri güvensiz olabilir diye, size müşteri kodda bunun anlamını değiştirmek için izin verilmez.

Burada birisi bile bir Java uygulaması, başka bir etki için HTTP üzerinden keyfi başlıklarını verebilir iddia, ancak bir korumalı alan Java uygulaması anything isteklerini yapmak için izin verilmez çünkü üzerinde etki dışında, sadece böyle değil o yüklenmiştir. Herkes onu düzeltmek edemeden o hızla onun yorum kaldırıldı ...

Case in point

Bir web tarayıcısı bir HTTP istemcisi. Bir HTTP istemci HTTP RFC uyumlu olmalıdır; böylece RFC bir yönlendirme başlığı gibi görünmelidir ne devletler uymak zorundadır. Bir web tarayıcı bir HTTP istemcisi olduğundan, bir web tarayıcısında gömülü herhangi bir uygulama must not, HTTP protokolünü ihlal isteklerini yapmak mümkün. Aslında standart bir every ihlali potansiyel bir güvenlik delik olmasıdır.

Her durumda: hava isteği belirlemek için orada is no doğru yolu etki alanı veya bir düşmanın etki alanından. Bu sadece, ağ-yapının bir çok acı kusurları biridir. Bu bahsedilen çözümlerden birini kullanmanız gerekir.

Hayır, bu yeterli değildir. Bu sayfaya bir HTTP isteği haline başlığı: Birisi "Referer" eklemek için saçmadır.

Kimlik doğrulama çeşit gerekir.

Aslında, bu form için dinamik bir adresi kullanabilirsiniz. Kullanıcı, 13mklasdkl34123 rastgele her kullanıcı ve mağaza için oluşturulan nerede www.something.com/form.php?13mklasdkl34123 iletilir böyle www.something.com / form.php gibi rasgele bir adrese sahip bir sayfa onu iletmek forma gittiğinizde gibi bu $ _SESSION. Formu gönderin aldıktan sonra, size yönlendirme adresi kullanıcı için oluşturulan adres olup olmadığını kontrol edebilirsiniz. Yönlendirme sahte olabilir, ama o (bireysel) form sayfasını ziyaret sürece atıfta dinamik bir parodi olarak adresini bilemez olamaz.