2011-02-05 134 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。