2011-02-05 120 views
0
<?php 

    $go = $_GET['go']; 


    if(!empty($go)) { 

    if(is_file("page/$go.html")) include "page/$go.html"; 

    else echo "<h1>Error 404</h1><p>Strona nie odnaleziona</p><p>Warunek ?go jest niepoprawny</p>"; 
    } 

    else include "page/start.html"; 

    ?> 
<script> 
$.get('go', function(change) { 
    $('#center').load('page/<?php echo $go ?>.html'); 
}); 
</script> 

我有這樣的想法,但它不起作用。我只是希望加載的頁面(?go = name)不會刷新整個頁面動態更改頁面

回答

1

首先,這容易受到LFI漏洞(本地文件包含)的影響。考慮一下當有人輸入時會發生什麼:http://site.com/file.php?go=../../../../../../../../etc/passwd%00

此外,你不能只是回顯你的文件名,並期望它打印出來......如果你想在$ go中包含頁面的內容並打印出$ go ,然後使用:

$go = urldecode([$_GET['go']); 
$go = str_replace("/", "", $go); 
$go = "page/$go.html"; 

編輯:其實,如果你用我上面的代碼,他們仍然可以訪問本地目錄中的文件,如htpasswd的和的.htaccess,所以纔不要讓你的用戶包括任何本地文件。有更好的方法來解決你的問題。

至於AJAX,請按照jeroen的建議。

+1

好的關於安全性的調用(儘管他*在最後加了`.html` ......),但是使用`basename()`這樣的東西就足夠了。 – jeroen 2011-02-05 22:20:48

+0

謝謝,我不知道PHP有這個功能。在任何情況下,如果您使用basename(),仍然可以像這樣在當前目錄中包含文件:http://site.com/file.php?$go=.htpasswd%00 – atx 2011-02-05 22:22:17

1

您正在混合兩個ajax函數,$.get.load並且您缺少一個事件處理函數。

你需要這樣的事情:

$('#go').live('change', function() { 
    $('#center').load('page/' + $(this).val() + '.html'); 
}); 

我已經萬一go按鈕位於頁面的刷新部分中使用live代替change

注意,我猜你要刷新基於選擇一個你的頁面的部分,這個問題/代碼isn't關於十分清楚......

0

是你要這算什麼實現?

<script type="text/javascript"> 
    $(document).ready(function() { 
     var getgo = '<?php echo $_GET['go']; ?>'; 
     if(getgo.length) { 
      $('#center').load('page/'+getgo+'.html'); 
     } 
    }); 
</script> 
<div id="center"></div> 

它將頁/ [你去PARAM]的.html的內容加載到#center。