2010-07-27 52 views
6

我正在做一個簡單的事情在PHP中,我不知道如何我可以測試,如果變量$路徑包含以下結構../PHP:防止文件夾黑客入侵 - 如果路徑有../在裏面?

所以我只是有一個?path = somepath結構在我的網址,如果有人會進入../它允許他去一個目錄。我當然知道這不是最好的解決方案,但是對於我的小東西來說,如果我只是在$ path變量中測試一個「../」字符串就足夠了。如果這樣死();

我不確定最佳的測試方法是什麼!

問候亞光

+0

爲什麼你使用這樣一條路徑? – 2010-07-27 11:02:51

+0

@mathi我很困惑你爲什麼要發送'?path = url'而不是鏈接中的實際URL。我告訴你,它的安全蠕蟲開放的可能性。 – 2010-07-27 12:45:10

+0

因爲我正在建立一種在我的服務器上讀取我的文件的filbrowser。一個文件包含整個用戶界面。 $ path設置文件夾路徑當前在我的文件瀏覽器中查看的文件夾。我不能只設置實際的網址,對我的項目沒有意義。 – matt 2010-07-27 23:04:35

回答

1

回答你的問題:

if(strpos($path,'../') !== false){ 
    // looks like someone 's trying to hack here - simply 
    // do nothing (or send an email-notification to yourself 
    // to be informed and see how often this happens) 
}else{ 
    // here comes the magic 

} 

但是:你真的不應該這樣做。如果您想要一個簡單的解決方案,請爲每個可能的$路徑使用switch-statement幷包含相關文件(或任何您必須執行的操作)。

+1

語言的任何原因? – RobertPitt 2010-07-27 09:45:56

+0

@RobertPitt:我不想得罪別人 - 我希望現在好一點;) – oezi 2010-07-27 09:50:31

+1

用+替換投票,它不會對自己感冒,但其他人會發現它不需要那個帖子:),快樂的日子 – RobertPitt 2010-07-27 09:52:06

11

而是這樣做的,你可以只調用它的realpath()並檢查它是否應該是在路徑就是一個前綴。

更好的是,爲什麼不保留白名單並拒絕其中的任何內容?

0

我是一個替代的解決方案,允許您自定義的URL ....

<?php 
$arr= array(
    "register" => "register.php", 
    "login" => "userlogin.php", 
    "admin" => "adminlogin.php", 
    "etc" => "otherpage.php", 
); 
if (isset ($_GET['path'])  
    if (array_key_exists($_GET['path'] , $arr)){ 
     //do some stuff... 
     include($arr[$_GET['path']]); 
    } 
    else 
     echo 'Page Not Found!';   
else 
    echo 'Required Field Empty!';  
?> 

所以調用index.php?path=adminadminlogin.php網頁將被列入....

+0

也確保你有,如果你的期運用 RobertPitt 2010-07-27 09:54:40

+0

不是真的..因爲(如果PHP配置精細)'的index.php?ARR [ihack] = ....'可能是隻從'$ PHP訪問_GET [ '常用3']'...在PHP腳本'$ arr'不會被替換.... – Marcx 2010-07-27 10:02:31

+0

而且更糟糕的是SQL注入攻擊'的index.php?ARR =?> DROP TABLE「'! – 2010-07-27 10:45:01

0

容易的方法之一是硬化您的php.ini配置,特別是open_basedir directive。請記住,一些CMS系統在代碼中確實使用了..\,並且在根文件夾外部包含這些內容時可能會產生問題。 (即梨模塊)

另一種方法是使用mod_rewrite

除非您使用包含文件檢查來自$_GET$_SERVER['request_uri']變量的每個注入URL,否則您將爲此類攻擊打開大門。例如,您可能會保護index.php而不是submit.php。這就是爲什麼強化php.ini.htaccess是首選的方法。

+0

mod_rewrite沒有任何幫助 – 2010-07-27 11:03:25

+0

@col你不能認真.. – 2010-07-27 12:38:48

+0

'index.php?arr =?> DROP TABLE'和/ item/DROP TABLE /'沒有區別。去搞清楚 – 2010-07-27 16:38:42

相關問題