Bu PHP ile yanlış bir şey

4 Cevap php

Bu kod ile yanlış bir şey görebiliyor musun, ya da optimize edilebilir?

Code from index.php, to include the file

if(empty($_GET['t'])) { 
    $folder = "apps/"; 
}else {
    $folder = str_replace("/", "", $_GET['t']) . "/"; 
}    

if(empty($_GET['app'])) { 
    include('apps/home.php'); 
} else { 
    if(file_exists($folder.$app.".php")) { 
        include($folder.$app.".php"); 
    } else  { 
        include("/home/radonsys/public_html/global/error/404.php");
    }
}

Benim sorun? kendisine mesaj bu sayfasını ve 404 sayfaya döner bulmak değil bir sayfa.

Eğer isterseniz, ben bu sayfa için form kodu içerebilir?

Code from bugs.php

<form method="post" action="">
    <div>Title</div>
    <div><input name="title" type="text" class="bginput" value="" size="59" tabindex="1" /></div>
    <br />
    <div>
        <label class="smallfont">
            Application
            <select name="app" style="display:block; width:200px" tabindex="2">
                <option value="Admin CP">AdminCP</option>
                <option value="Add User">Add User</option>
                <option value="Bugzilla">Bugzilla</option>
                <option value="Portal">Portal</option>
                <option value="To Do">To Do</option>
                <option value="Internal Messages">Internal Messages</option>
                <option value="User CP">UserCP</option>
                <option value="Change Password">Change Password</option>
                <option value="Change Email">Change Email</option>
                <option value="General">General</option>
            </select>
        </label>
    </div>
    <br />
    <div>Bug Description</div>
    <textarea name="content" style="width:7%"></textarea>
    <br />
    <div>
        <label class="smallfont">
            Priority
            <select name="priority" style="display:block; width:200px" tabindex="2">
                <option value="0" selected="selected">Unknown</option>
                <option value="1">1 - Highest</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
                <option value="5">5 - Medium</option>
                <option value="6">6</option>
                <option value="7">7</option>
                <option value="8">8</option>
                <option value="9">9</option>
                <option value="10">10 - Lowest</option>
            </select>
        </label>
    </div>
    <br />
    <input type="submit" value="Save" />
</form>

Clarification

Yukarıdaki komut bir sayfada çağırır, index.php ise, örneğin,? App = hata uygulamalar klasöründe bugs.php içerir.

Biz hata sayfası, 404.php ile sıkışmış konum beri bugs.php senaryo üzerinde sayfalar veri göndermek için kendisine POST kullanır, ancak, yazılan veri sayfasını kendisi ulaşır asla

4 Cevap

Eh, bu bazı uygulama / sayfa sorunu vardı neden cevap select id tesadüfen, sayfanın için app değişken app, becuase oldu, bu yüzden doğru sayfaları getiriliyor değildi.

Tip Remember to name your properties carefully!

you are saying the form posts to itself, does that mean you are using POST?
if so, you need to change $_GET[] to $_POST[]

Eğer göndermeden fazla kod, daha iyi.

Bazı yorumlar:

  • You can use $_REQUEST if you want to get the variable from POST or GET.
  • You don't seem to be setting $app anywhere.
  • Eğer (örneğin bir beyaz ya da bir dosya adı aynı olmalıdır deseni) içeren dosyaları ne ilişkin daha sıkı olma düşünebilirsiniz.

Eğer form etiketi method="post" kullanılarak, ve $_GET gelen verileri almak için çalışıyoruz çünkü yaşıyorsanız sorundur.

method = "post" formu değerleri $_POST['fieldname'] veya $_REQUEST['fieldname'] (ki POST hem de içerir ve değerleri GET) ile erişilebilir olduğunda. Ayrıca formun method için GET değiştirebilir

Ancak, ben görebiliyorum büyük sorundur ..

include($folder.$app.".php");

Yani (tek yer $app deftere kodu, gelebilir ki) register_globals kullanıyorsanız, özellikle korkutucu

Say $_GET['app'] ayarlanır ..

../../something/else.php

.. Siz de dahil olacak ..

$_GET['t'] . "../../something/else.php"

Eğer have dinamik kullanıcı girişi dayalı dosyaları dahil, tüm non-alfa-sayısal karakterler şerit ve geçerli dosyaların bir beyaz liste var - aşağıdaki gibi bir şey:

$valid_files = array("General", "Todo");
$safe_filename = preg_replace("/[^a-zA-Z0-9]/", "", $_REQEST["app"]);
if(in_array($safe_filename, $valid_files)){
    include("apps/" . $safe_filename . ".php");
}

Kullanarak örneğin yönlendirme yapmanın başka yolları vardır header("location: ..."):

header ('HTTP/1.1 301 Moved Permanently');
header ('Location: ' . $new_location);

Tabii ki güvenli bir şekilde $new_location sterilize etmek lazım ama (o dinamik sunucu üzerinde keyfi komut yürütme değil beri) include() kullanarak daha az sorunları var

Temelde komut dosyası gibi bir şey yapmak istiyorum:

$safe_filename = preg_replace("/[^a-zA-Z0-9]/", "", $_REQUEST["app"]);
$new_location = "/apps/" . $safe_filename . ".php"; // construct new URL

// If it's valid, redirect, if not, return error 404
if(in_array($safe_filename, $valid_destinations)){
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: ' . $new_location);
} else {
    header("HTTP/1.0 404 Not Found");
}