簡體   English   中英

如何防止來自php的遠程文件包含攻擊?

[英]How do i Prevent remote file inclusion attack from php?

這是我在index.php中的代碼

include ($_GET['page']);

實際上,我需要包含來自url的頁面,例如

"?page=go.php"

另一方面,我無法過濾

"?page=example.com"

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

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

但是它只過濾

"?page=go.php"

這頁的短褲。 和我很爛

"?page=example.com"

這頁的短褲。

如果我正確理解了這個問題; 您可以使用“允許的”頁面設置數組,例如:

  $allowedPages = array('go.php', 'stop.php', 'file.php');
  $filename = $_GET['page'];

  if(in_array($filename, $allowedPages) && file_exists($filename)){
    include ($filename);
  }else{
    //output error
  }

我認為這個答案為時已晚,但是對於那些可能會搜索此問題的人,我想也可以這樣做:

1,定義一個完整路徑的常數

2.定義允許頁面的白名單。

3.獲取$ _GET變量,並將其轉換為小寫。

4.然后,如果$ _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');

我不是100%確信沒有任何問題就能解決問題,但是我想這是一個好的開始,您可以嘗試一下,找出適合自己的方法。

老實說,您創建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');
    }

    ?>

不接受page.php參數,僅接受文件名。

"?page=go"

然后檢查$ _REQUEST [“ page”]是否為字母數字

if (ctype_alnum($_REQUEST["page"]))

而且,不要給文件使用非字母數字名稱。

然后,如果file_exists位於$ _REQUEST [“ page”]上,您應該會很好。

PS $ _REQUEST [“ page”]與$ _GET [“ page”]大致相同,只是與$ _POST相交

您可以過濾其他域網址,而不是過濾文件。 如果參數包含的主機名少於3個字母,則可以正常使用,因為沒有域是2個字母。

   $tmp= parse_url ($_GET['page']);
   if(strlen($tmp['host'])<3)
    include($_GET['page']);

如果有一些受信任的主機,那么您也可以對其進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM