Dinamik Dahil

8 Cevap php

Ben birçok sayfaları vb bir dizi / kullanım anahtarı puttingt izin sayfaları olmadan $ _GET ile sayfaları eklemek için güvenli yolu ne olurdu hiç teşekkür ederim.

$content = addslashes($_GET['content']);

if (file_exists(PAGE_PATH."$content.html")) { 
include(PAGE_PATH."$content.html");
}

Bu ne kadar güvenli?

Teşekkürler.

8 Cevap

Bu çok kötü bir uygulamadır. Kurulum yerine doğrudan bir kullanıcı tarafından sağlanan bir değişken eklemeniz çalışırken daha idam veya alınan gereken kod sevk işlemek için bir denetleyici olmalıdır. Dosyaları dahil olduğunda hiç, kullanıcı girişi güven olmamalıdır. Sen dahil istemediğiniz şeyler de dahil olmak onları önlemek için hiçbir şey yok.

Eğer geçerli bir desen için giriş kontrol eğer güvenli uyursun. örneğin Eğer dahil dosyaların bir alt asla bilmek ve her zaman alfanümerik varsayalım

if (preg_match('/^[a-z0-9]+$/', $_GET['page']))
{
    $file=PAGE_PATH.$_GET['page'].".html";
    if (file_exists($file))
    {
         readfile($file);
    }
}

. Html dosyaları sadece statik sanki ben dahil kullanmaya gerek yoktur, readfile kullandım.

Yaklaşım ile olası kusur sistemde herhangi bir HTML dosyası için bir yol mühendisi, ve PHP gibi idam sahip olabilir. Eğer dosya sistemi üzerinde kendi düzenledikleri bir HTML dosyasını almak için bir yol bulabiliriz, size komut dosyası aracılığıyla yürütebilirsiniz.

Sadece "bir-zA-Z-" kabul eden bir regex karşı maç.

edit: Ben belirli kalıpları engelleme iyi bir fikir olduğunu sanmıyorum. Dediğim gibi ben değil, sadece biz o patlatır neden olmayacak biliyorum karakter kabul eden bir regex yapardım.

Tüm altında var sayfaların "izin" set varsayarsak PAGE_PATH, sonra aşağıdaki gibi bir şey önerebilir:

  • Sayfa adını Trim
  • (Mutlak yolunda bir girişim olabilir) bir bölü çizgisi ile başlayan sayfa adlarını Reddet
  • .. (yol geçişi bir girişim olabilir) içeren sayfa adlarını Reddet
  • Açıkça prefix PAGE_PATH ve (umarım) güvenli bir yol bulunmaktadır

Lütfen sayfa isimleri tüm tutarlı bazı kuralları takip ederseniz, örneğin alfanümerik karakterler, o zaman teorik olarak "kötü" sayfa adlarını reddetme, doğrulamak için normal bir ifade kullanabilirsiniz.

Bazı more discussion of these issues PHP web sitesinde var.

Eğer sayfa aslında görüntülemeden önce varolduğunu kontrol edilir gibi genellikle güvenli görünüyor. Ancak, insanlar geçerli $ _SESSION kimlik bilgileri ile görüntülemek mümkün olmamalıdır sayfaların bir kara liste oluşturmak isteyebilirsiniz. Bu bir dizi / anahtarı ile veya sadece belirli bir dizindeki tüm özel sayfaları var, ve bunun için kontrol edebilirsiniz ya da yapılabilir.

Yapmak değil. Tüm olası saldırıları tahmin asla ve kesmek alırsınız.

Eğer diziler ücretsiz ve örneğin kod tutmak istiyorsanız, iki sütun, kimliği ve yolu ile bir veritabanını kullanır. Sayısal kimliği tarafından sayfasını isteyin. Geçerli kimlikleri sizin aralığında tamamen sayısal ve uğramamış kimlikleri için tüm istekleri görmezden. Eğer SEO konusunda endişeleriniz varsa taşması yaptığı gibi, senin bağlantıları sayısal id sonra rasgele bir sayfa adlarını ekleyebilirsiniz.

Veritabanı ağır olmak zorunda değildir. Örneğin, SQLite kullanabilirsiniz.

Güvenli yöntem isteğinde biraz temizlik içerir.

  1. Herhangi bir ../ soymak dışarı
  2. Dışarı şerit ^\/

Oradan, onlar talep ediyoruz dosya varsa görmek için kontrol ettiğinizden emin olun, ve okunabilir. Sonra, sadece include bunu.

XSS saldırıları önlemek için böyle en azından bir şey kullanmak gerekir.

$content = htmlentities($_GET['page'], ENT_QUOTES, 'UTF-8');

Ve addslashes SQL Enjeksiyon sizi korumaz.