Dosya Güvenli Var?

6 Cevap php
if (file_exists("pages/$page.php")) {
  include($page.'.php');
}

Bu güvenli mi?

Güvenli i vb uzaktan komut içerir olamaz anlamına

6 Cevap

Kesinlikle, özellikle $page = "./configuration"

Ben böyle bir şey ile değiştirilmesi tavsiye ederim:

$pages = array("blog", "home", "login");
if (in_array(strtolower($page), $pages))
  include("pages/$page.php");

EDIT: Bu kod ile kabul sayfaların bu liste oluşturabilirsiniz.

$pages = array();
if ($dh = opendir("pages")) {
  while (($file = readdir($dh)) !== false) {
    if (strstr($file, ".php") !== false) // make sure it is a .php file
      $pages[] = substr($file, -4); // remove the .php
  }
  closedir($dh);
}

Deftere kod inanıyorum bir yazım hatası var. Bu olmalıdır:

if (file_exists("pages/$page.php")) {
  include("pages/$page.php");
}

PHP ayarları o, uzaktan dosya dahil izin verirseniz Ancak, kod enjeksiyon yol açar.

Sen dahil sayfa herhangi bir keyfi sayfa olamaz emin olmanız gerekir.

Genellikle iyi uygulamalarında bunun belli bir dizine yükleyecektir dosyaları ve sınıfları kısıtlar, veya dosyaların önceden tanımlanmış belli bir dizi, ancak, Fabrika Yöntemi kullanılarak bir "Loader" sınıfında kod bu tür görürsünüz.

$ Sayfa asla set ise, PHP o zaman php.ini içindeki variables_order yönergesini aşağıdaki ne olabilir bulmaya çalışacağız. Bu yönerge PHP değişkenleri bulmak için sırasını söyler. Bunun için varsayılan EGPCS olduğundan, kurnaz bir korsan daha sonra sizin komut arama ve PHP de erişimi olan herhangi bir dosyayı eklemek için bunu söylemek.

Ex:

www.example.com/?page=dbConfig.ini

Bir dizideki tüm olası sayfa adlarını depolamak güvenli yaklaşım olduğunu, ama aynı zamanda sadece verilen sayfa adını doğrulayarak ve size sayfalar listesi herhangi bir "tehlikeli" dosyaları yok sağlayarak oldukça güvenli olabilir.

$page = basename($_GET['page']);
if (file_exists("pages/$page")) {
  include("pages/$page");
} else {
  include("pages/default.php");
}

Eğer varsa o zaman kontrol, diğer dizinlere erişim potansiyeli engellemek için basename ($ _REQUEST ['sayfa']) kullanın.

http://php.mirror.facebook.net/manual/en/function.basename.php

Ceejayoz bucabay yanıtında yorumladı gibi, istenen sayfa bir kullanıcının kolayca olmaları gereken yerde patlak verir ki ".. /" olabilir. Başka bir soruya benim cevabım da size hizmet etmelidir.

http://stackoverflow.com/a/12361051/1524693

Bağlantı ölürse: dosyanın realpath () içeren dizinin realpath () ile başlıyorsa eğer Temelde, dahil dizinin realpath () ve istenen dosyayı kontrol dahil etmek güvenlidir. (Ben dosya yolu ekleme yolu ile başlar olmadığını kontrol etmek) (== 0 strpos kullanılır)