2010-12-21 72 views
0

我正在設計一個網站,其中各種外部鏈接都顯示在我的頁面上。我使用網址或內容作爲頁面標題中的變量

$url=$_GET['url']; 
$website_data = file_get_contents($url); 
echo $website_data; 

所以基本上用戶會點擊一個超鏈接是像www.test.com/display_page.php?url=http://www.xyz.com/article/2.jpg

我的頁面,list_of_images.php,通常具有HREF圖像的每個圖像的列表如上在頁面,當任何圖像被點擊時,它會去display_page.php,這將顯示我們的橫幅在這個頁面的頂部,一些文字,然後這個圖像下面。此圖片可能來自任何網站。

我目前直接發送url並用GET抓取它。我明白,用戶/黑客實際上可以做一些編碼,併爲url變量發送命令,並可能破壞服務器或做一些有害的事情,所以我想避免這種方法或直接在標題中發送URL。這個問題的替代方法是什麼?

回答

0

我會確保URL以http://https://開始:

if(preg_match("`^https?://`i", $_GET['url'])) 
// do stuff 

您可能還希望確保它不指向任何地方內部:

if(preg_match('`^https?://(?!localhost|127\.|192\.|10\.0\.)`i', $_GET['url'])) 
// do stuff 

而不是一個很大的骯髒的正則表達式,你可以去一個更優雅的主機黑名單的方法,但你得到我的漂移...

1

安全的方法是使用存儲在數組或數據庫中的一組固定資源,並使用適當的鍵作爲參數。

$ress = Array('1' => 'http://www.google.com/', ...); 

$res = $ress[$_GET['res']]; 
+0

感謝您的回覆。我無法使用數據庫或數組,因爲圖像和網址每分鐘都會動態變化。 – 2010-12-21 05:54:37

+1

即使它們每秒都在變化,我也不明白爲什麼你不能使用數據庫。 – 2010-12-21 05:56:16

+0

@Scorpion King:唯一的方法是隻允許相對URL,並且非常小心地清理它們以免'/'出現。確保它匹配這樣的東西:'/^[a-z0-9 -_] + \。(jpg | jpeg)$/i'。 – Jonah 2010-12-21 06:00:23

0

嘗試POST ....

嘗試做這個使用POST方法

相關問題