Güvenli Dinamik Dahil

6 Cevap php

Ben bu PHP dinamik kullanıyorum sitemde kodunu içerir. Ama bu nasıl yerine daha güvenli ve daha iyi kod yazabilirsiniz, güvenli değil düşünüyorum:

$page = (empty($_GET['page'])) ? '' : $_GET['page'].".html";

if (empty($page))
{ 
 $page = 'index.html';
}

else
 {
 $page = $page;

 }

 include($page);

Thank you very much

6 Cevap

Güvenlik açısından, her zaman politika kötü bir politika olduğunu verir. Istek geçerli ve güvenli olduğunu sanmayın. Her zaman açık inkar ve beyaz liste kullanın:

switch($_GET['page']): 
   case 'page-a': case 'page-b': case 'other-page':
      include $_GET['page'] . '.html';
      break;
    default: 
      include 'index.php';
endswitch;

Beyaz liste korumak için zor ise, temel isme kullanmak, tek bir yolu olanaklarını daraltmak için deneyin:

$name = basename($_GET['page']);
include 'includes/' . $name . '.html';

Bu şekilde sürece bu dizinin tüm içeriğini tutmak (ve tüm yolları dahil) olarak, güvenlik hakkında çok fazla endişe güvenli (birisi bu dizinin bir tehlikeye dosya upload olabilir fark) gerekmez.

Yukarıdaki başarısız olursa, realpath() kullanmak ve dosya belirtilen dizin ağacında olduğundan emin olmak için deneyin.

Sen preg_replace() sayfa adı zararlı bir şey içermediğinden emin olmak için kullanabilirsiniz:

// $page can only contain letters, numbers and '_'
$page = preg_replace('/[^a-zA-Z0-9_]/', '', $_GET['page']);
include "pages/$page.html";

Dosyaların bu şekilde dahil olmasına izin verilmesi ne belirlemek için beyaz liste çeşit tanımlamak ve dahil yapmadan önce bu listeyi kontrol edebilirsiniz.

Başka bir yol, sadece belli bir dizin (veya alt dizinleri) bünyesinde içerir izin ve istenen dosyaları bu dizin içinde olduğunu doğrulamak olacaktır.

Birisi sayfa parametresi "http://example.com/unsafe_file" koyar ne olur? Sizin komut muhtemelen dışarı çıkmak ve mutlulukla uzaktan güvensiz script indir, ve sonra orada bulduğu herhangi bir php kod yürütmesine olacaktır. Diğer şeyler arasında, dahil, bir sunucu kendi yararlanabilir. Ya da veritabanı şifreleri yazdırın. Veya hassas bilgileri açığa. Alt satırda bu tür kesinlikle güvenli değildir ve kullanılmamalıdır içerir olduğunu.

Bunun yerine, izin ve buna karşı Paramtre kontrol sayfalık bir beyaz liste kullanmak, ya da sayfa içeriğini bir veritabanı oluşturmak almak gerekir. Ama sadece dosyaları da dahil olmak kullanılmamalıdır.

Genel olarak, ben include veya require sağlıksız kullanıcı girişi kullanarak herhangi bir arama yapmak olmaz. Bu çok riskli. Ne kullanıcı web kök dışında bir dosyayı isterse?

Ya gereken bir beyaz liste kullanılarak dahil edilebilir ne sınırlamak, veya include veya require gibi böyle güçlü bir çağrı kullanıcı girişi gerektirmeyen başka bir şey. Aksi takdirde, Remote File Inclusion attacks kendinizi açın. Orada allow_url_fopen devre dışı bırakarak, RFI azaltmak için yolları vardır, ama sadece tamamen durumu önlemek için en iyisidir.

Ben $ sayfa var geçersiz dosya karakterleri denetliyor, tavsiye ederim (? Yani \ /: * <>) ve dosyaları php adlı file_exists() yöntemini kullanarak olup olmadığını da kontrol edin.

Gibi bir şey

$bad_chars = array("\\", "/", ":", "*", "?", ">", "<", "Foo", "Bar");
$file = str_replace($bad_chars, "", $file);

if (!file_exists('/' . $file))
{
    echo 'bad file name';
}