Güvenliği ve URL verilere dayalı içerir

5 Cevap php

Şu bir güvenlik riski mevcut bildirimde içerir?

include "pages/".$_GET["page"].".php";

If yes:
- why?
- what would be a safer approach?

5 Cevap

Evet. Yeni başlayanlar için, doğrulama çeşit olmadan doğrudan GET değişkenleri kullanarak, ever. Asla

Buna ek olarak, bir yolun keyfi şartname dahil izin vermemelidir.

Kesinlikle çok dinamik-lik ya da bunun yerine 'şeyler sevk belirteçleri geçmesi gerektiğini gerektiriyorsa Bunun yerine, doğrudan belirli bir içinde yollara içerir kısıtlamak (ve belirtilen yolda o dizindeki bir dosyaya başvurduğu kontrol) etmelidir ya d içerir (ve daha sonra verilen bir belirteç ifade eder dosyasına ne olduğunu görmek için bir ilişkisel diziye bir arama gibi bir şey yapmak) istiyorum.

İkinci bir örnek, bu gibi bir şey olacaktır:

$allowed_pages = array(
  "page1" => "pages/page1.php",
  "page2" => "pages/page2.php",
  "foobar" => "pages/page7.php",
  "stuff" => "pages/blarg.php"
);

$page = $_GET['page'];
if(array_key_exists($allowed_pages, $page)) {
  include($allowed_pages[$page]);
}

(Bu durumda, sadece belirtilen anahtarlar dahil edilebilir ne doğrulama ve kısıtlama hem de eylemlerine izin gerçeği.)

Örnekte ../../settings.php başka bir şey - in $_GET["page"] sen dışında yok bir yol olabilir, çünkü risktir.

Bu gibi yapılmalıdır:

$allowedPages = array('news', 'contact', ...);
if ( in_array($_GET["page"], $allowedPages) ) {
    include "pages/".$_GET["page"].".php";
} else {
    throw new Exception('Page is not valid !');
}

İyi bir şey de dosya olup olmadığını kontrol etmektir.

Sen aslında onları sistemde var PHP HERHANGİ parça yürütmek için yeteneğini veriyoruz. Bu oldukça büyük bir bilinmeyen bulunuyor.

Şimdi işaret yok "tehlikeli" kod olsa bile, gelecekte olabilir, çünkü temelde bu risklidir.

Yanı sıra bir beyaz liste sahip olarak, böyle bir şey yapabileceğini

$include = $_GET['page'];

if ( ! preg_match('/^[a-z-_]+$/i', $include)) {
    throw new Exception('Access denied');
}

.. "sayfaları /" $ _GET ["sayfa"] ". php" içerir;

Eğer bir önek kodlanmış ettik gerçeği gibi saldırıları engeller:

? Page = http% 3A% 2F% 2Fwww.blackhat.com% 2Fbad.code% 3F

Ama $ _GET ['sayfa'] içerebilir, çünkü '..' sonra birisi any sistem bir php uzantılı dosya eklenmesini zorlayabilir. Bu bir güvenlik uzlaşmayla sonuçlanması asla emin misiniz?

Başkaları tarafından önerilen gibi bir beyaz kullanarak çok daha güvenli ve aynı zamanda uzaktan dahil güvenlik açıklarını önlemek için yolu öneki için gereksinimini ortadan kaldırır.

C.