Form tekrar / man-in-the-middle PHP, csrf, XSRF saldırının nasıl engellenir

3 Cevap php

Ben bir web formu var ve ben PHP kullanıyorum. Ben formları (Ben tekrar saldırı ya da bir man-in-the-middle saldırısı denir inanıyorum) manipüle edilebilir farkındayım. Yani gizli bir alan olarak bazı özgünlük belirteç kullanmak istiyorum.

Ben farkında değilim tehdit olasılık vardır:

  • Saldıran (ben inanıyorum bu man-in-the-middle saldırısı olduğu) meşru kullanıcının formu kaçırdı
  • meşru kullanıcı saldırganın kendisi olduğunu: O, formunu alır belirteci okur ama (ben inanıyorum bu tekrar saldırı) tehlikeli veri göndermek için kullanır

Ben sorulara gelmeden önce belki benim anlayış kusurludur çünkü söylediğim şey, bugüne kadar yanlış ise, beni düzeltin lütfen.

Şimdi sorulara:

  • Ne onsuz formu (örneğin, tuzlama?) Reddetti olur böylece bu belirteç oluşturmak için en iyi uygulamadır.
  • Insanlar belirteç çalınır edilmediğinden emin olmak için ne yapmalıyım.

Yorumlarına dayanarak yeni küçük sorular:

  • Oturum kaçırma adam-in-the-middle saldırısı olarak aynı mı?

3 Cevap

Siz başlığında CSRF bahsedilen ama gerçekten söz onu ele vermedi.

Sen online hakkında detaylı olarak okuyabilirsiniz, ama CSRF temelde meşru bir kullanıcı bilmeden bir siteye göndermek sağlayan bir saldırıdır. SO tür saldırılara karşı korumak değil Örneğin, ben size ("Bir Milyon dolar kazanın gerçekleşmesi için başka bir şey bekliyordum, benim bu kötü şeklinde tıkladığında SO profil bilgi değiştirilemez neden bir form zanaat olabilir! Burayı! "). Bu form SO ile auth ve SO Eğer meşru profilinize güncellemeleri göndererek edildi o görünmesi için tarayıcı çerezlerini kullanmak istiyorsunuz.

Bu karşı korumak için, gerçekten bir kaç şey yapmak istiyorum:

  • O (örneğin bir GET sorgu params kullanarak bir kullanıcının profiline yeni bir durum güncelleme sonrası yok) güncelleştirmeleri neden olmaz GETler sağlamak
  • Tüm mesajlar form başkası tarafından servis değil tarafından oluşturulan olduğunu doğrulamak sağlar, ve amaçlanan kullanıcı için olduğunu gizli bir alana eşlik emin olun. Yani bu gizli alan sunucu tarafından bu form için html aşağı gönderir her zaman üretilir olmalı, ve bu oturum için o kullanıcı için benzersiz olmalıdır.

Bu ikinci öğeye bir alternatif yönlendirme her zaman sitenizin veya gelen POST beklediğiniz bir site olup olmadığını kontrol etmektir. Bazı tarayıcılar / ağ donanım yönlendirmeleri çıkarmaz çünkü HTTPS olmayan siteler için bu teşvik yoktur ve her zaman bir yönlendirme var olduğunu güvenilir değil.

Belirteci üretmek için kullanılan yöntem son derece önemli değildir. The important thing is that the token gets to be used only once. kullanıcının oturumunda kullanıcı için oluşturulan belirteçleri bir listesini tutun. Kullanıcı bir form gönderdiğinde ve sunulan belirteç oturumda değil ise, formu reddedebilirsiniz.

Man-in-the-orta karşı korunması biraz zor. Gördüğüm ortak teknik belirteç oluşturmak için karma işlevi gizli form alanları dahil olmak üzere tüm ve o zaman bilinen gizli alanlara dayalı belirteci yenileyici. Ancak bu, yalnızca ortada adamın nihai hedefi olmayabilir, hangi gizli alan manipülasyona karşı korumak istiyorum.

Kullanıcı başarıyla belirteci ile bir form gönderdiğinde, oturumu belirteci silmek, bu nedenle herhangi bir replay of that submission başarısız olur. Ancak, tüm bu alan başka bir belirteç oluşturmak için tekrar formu isteyen kullanıcı. Bu yeni belirteç daha sonraki otomatik saldırılarda kullanılabilir. In other words, form tokens are useful against CSRF, but not highly effective against automated replay and man-in-the-middle attacks.

Aynı şekilde, formlarda kullanıcının geri butonu kullanımı gerektirmeyen için uygulama uyarlamak istiyorum gidiyoruz. Onların sunulması ile ilgili bir sorun varsa, size kullanıcı hatayı düzeltmek için onu geri düğmesine basarsa, ona teslim sonra nedeniyle artık geçersiz için başarısız olacak doldurulmuş kendi verileri ile kullanıcıya geri formu dönmek için ihtiyacımız olacak belirteci.

Ayrıca, samimi olmak gerekirse, zaman zaman istek tekrarları ve man-in-the-middle saldırıları, sizin kullanıcının bağlantı çoktan aşıldığını hakkında endişelenmenize gerek, ve çok herhangi bir zararı hafifletmek için yapabileceğiniz muhtemelen orada değil. Başına SSL MiTM ve tekrar izlemek karşı yeterli koruma seviyesi olduğunu ve bu konuda endişeli iseniz, SSL altında çalışan olacak ...

Bu belirteç oluşturmak için, burada da iyi iş gibi görünüyor ben kullanabileceğiniz bir stratejidir.

  • (Her zamanki hileler kullanarak sunucu üzerinde oluşturulan) rastgele bir değere bir cookie ve ihtiyaçlarınıza göre sona erecek ayarlayın.
  • Bir form ile bir sayfa kadar hizmet zaman, değeri bu cookie değerine eşit bir gizli alan embed.
  • Mesajı tutarken, bu alanda var olduğunu doğrulamak ve değeri kullanıcının çerez eşleştiğini