php - 如何防止php中的遠程文件包含攻擊?

  显示原文与译文双语对照的内容
95 1

這是我在 index.php 中的代碼

include ($_GET['page']);

Actully我需要包含來自url的頁面,如

"?page=go.php"

另一方面我不能過濾

"?page=example.com"

對於某些情況,我還需要包括這個值。但這是一個遠程文件包含( RFI ) 漏洞。如何防止來自我網站的RFI攻擊?我在做一些

$filename = $_GET['page'];
if (file_exists($filename)) {
{
include ($_GET['page']);
}

但它只過濾

"?page=go.php"

這一頁的短褲我被sucked了

"?page=example.com"

這一頁的短褲。

时间:原作者:0个回答

93 0

如果我正確理解問題,你可以使用'允許'頁面設置 array,例如:

 $allowedPages = array('go.php', 'stop.php', 'file.php');
 $filename = $_GET['page'];
 if(in_array($filename, $allowedPages) && file_exists($filename)){
 include ($filename);
 }else{
//output error
 }
原作者:
63 0

我認為這個答案太晚了,但對於那些可以能搜索這個問題的人來說,我也可以以這樣做:

1.Define 具有完整路徑的常量。

2.Define 允許頁面的白名單。

3.Get 變數,並將它的轉換為小寫。

4.Then 如果由 $_GET 變數返回的頁面位於白名單中,則需要它,否則將用戶重定向到主頁,並顯示錯誤信息。

<?php
# this is abcd.php
define('SITE','http://www.yoursite.com/');
$allow = [SITE.'1.php', SITE.'2.php', SITE.'3.php'];
$get = strtolower(SITE.$_GET['page']);
if(in_array($get,$allow)){
 include $get;
} else {
 header('Location: index.php?param=incorrect');
}
?>
<?php
# this is index.php
if(isset($_GET['param']) && $_GET['param'] == 'incorrect'){
?>
 <script type="text/javascript">
 alert("INCORRECT PARAMETER PROVIDED");
 </script>
<?php
} else die('ERROR');

這是一個不錯的開始,但我想是一個不錯的開始,你可以 play,找出適合你的東西。

原作者:
108 0

老實說,創建 dynamic 網站的方法絕對不是你去的方法。

要回答這個問題,你應該做如下的事情:

你必須設置一個 whitelist的文件,該文件將包含在這裡函數中。

可能看起來像這樣:

<?php 
$whitelist = array(
 'file1.php',
 'file2.php',
 'file3.php',
 'file4.php',
 'file5.php',
);
?>

在包含上述文件之前,你已經在 in_array() 運行了一個檢查。

<?php 
if(in_array($_GET['page']. '.php', $whitelist) && file_exists($_GET['page']. '.php')) {
 include($_GET['page']. '.php');
}
?>



就像你所看到的,並不是很漂亮 !另一種方法是做一些類似的事情:

 <?php 
 $file = strtolower($_GET['page']). '.php';
 if(isset($whitelist[$file]) && file_exists($file)) {
 include($_GET['page']. '.php');
 }
?>
原作者:
...