Bu kod korsan saldırıya karşı savunmasız mı?

5 Cevap php

Ben online web uygulaması için gerçekten yeni duyuyorum. Ben bu kodu var, php kullanıyorum:

if(isset($_GET['return']) && !empty($_GET['return'])){
return = $_GET['return'];
header("Location: ./index.php?" . $return);    
} else {
header("Location: ./index.php");

}

$return değişken kolayca hacker tarafından değiştirilebilir URL değişkendir.

Örnek: i olsun bu gelen $return değişken: www.web.com/verify.php?return=profile.php

Ben dikkat gereken bir şey var mı? Ben bu hat htmlentitiesi kullanmalısınız:

header("Location: ./index.php?" . htmlentities($return));

O bir hacker tarafından saldırıya karşı savunmasız mı?

Ne ben kesmek önlemek için ne yapmalıyım?

5 Cevap

Apart 2. hatta bu yazım hatası dan ($ ['dönüşünü'] = $ _GET iade edilmelidir ;) yapmanız $return = urlencode($return) bu parametre indeksi olarak iletildiğinde $ olarak dönüş geçerli bir QueryString olduğundan emin olmak gerekir. php.

index.php o dönüş kullanıcı erişimi olan geçerli bir URL doğrulamalısınız. Ben index.php nasıl çalıştığını bilmiyorum, ama sadece bir sayfa görüntüler ise o zaman index.php gerçekten bir güvenlik sorunu olabilir ki? / Etc / passwd veya benzeri gibi Someting ile bitebileceğini.

Edit: Ne güvenlik delik alabilirim? : Index.php dönüş değeri nasıl kullandığını bağlı görebiliyordu iki olası sorunlar vardır

  • If index.php redirects the user to the target page, then I could use your site as a relay to redirect the user to a site I control. This could be either used for phishing (I make a site that looks exactly like yours and asks the user for username/password) or simply for advertising.
  • If index.php displays the file from the return-parameter, I could try to pass in the name of some system file like /etc/passwd and get a list of all users. Or I could pass something like ../config.php and get your database connection
    • Ben burada böyle olduğunu sanmıyorum, ama bu yine de işaret etmek istiyorum böyle ortak bir güvenlik açığı olduğunu.

Dediği gibi, sorgu dizesi içinde geçtiğini URL geçerli olduğundan emin olmak istiyorum. Bunu yapmak için bazı yollar olabilir:

  • $newurl = "http://yoursite/" . $return;
    • Bu yalnızca etki her zaman emin olun ve herhangi bir diğer etki alanına yönlendirme asla
  • $valid = file_exists($return)
    • $ Dönüş her zaman sabit diskinizde bulunan bir sayfa olursa çalışır. Gerçekten o dönüş kontrol ederek sahte girişlerini filtre geçerli bir dosyaya işaret
    • Dönüş querystrings (yani dönüş = profile.php? Adım = 2) kabul ederseniz, o zaman "profile.php" yolunu ayrıştırmak gerekir
  • Have a list of valid values for $return and compare against it
    • index.php sadece sayfaları kümesi verilen ta iade böylece gerçekten uygulaması tasarladık sürece bu, genellikle pratik değildir

Orada bu kediyi için birçok yolu vardır, ama genellikle bir şekilde geçerli bir hedef olduğunu $ dönüş noktalarını doğrulamak istiyor. Nedir bu geçerli hedeflerdir kendi özelliklerine bağlıdır.

Eğer PHP 4 veya 5 hem de eski bir sürümünü çalıştırıyorsanız, o zaman enjeksiyon header savunmasız olacağını düşünüyorum - Birileri yapmak istediğiniz diğer üstbilgileri tarafından izlenen bir çizgi dönüş, ardından, bir URL'ye dönüşünü ayarlayabilirsiniz sizin sunucu gönderme.

Önce dize sterilize bu önlemek olabilir. Bu hat döner soymak için yeterli olabilir ama karakter bir izin listesi var daha iyi olurdu - bu pratik olabilir.

4.4.2 and 5.1.2: This function now prevents more than one header to be sent at once as a protection against header injection attacks.

http://php.net/manual/en/function.header.php

Eğer olmasaydı bir sayfaya koyarsanız ne olur. Örneğin:

return=blowup.php

veya

return=http://www.google.co.uk

veya

return=http%3A%2F%2Fwww.google.co.uk%2F

You could obfuscate the reference by not including the .php in the variable. You could then append it in the code-behind and check fveya the existence of the file in your directveyay / use a switch statement of allowable values befveyae redirecting to it.

Bu durumda, daha index.php üzerine sorgu dizesi o kısmı ile ne yaptığına bağlıdır. Bir veritabanı sorgusu, çıktı, eval(), ya da exec() Evet, onun çok yaygın bir güvenlik açığına gönderilen eğer. Most diğer durumlar onların HTML varlık tüm çeşitleri tırnak dönüştürür, hem de semboller eşittir kendi genel amaçlı sanitasyon işlevi yazmak filtresiz güvenli olması, ancak onun iyi olacaktır.

Ben yaparım şeyler şunlardır:

  1. Define, dönüş değerleri ne tür izin verilir?
  2. Olası dönüş değerleri her türlü yazın.
  3. Sonra, sonuçlar olun: izin verilmez ne karakterleri, etki izin ne maksimum url uzunluğu, vs ne
  4. Nihayet: Yukarıdaki sonuçlara göre bir filtre işlevi yapmak.