2010-12-21 39 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方法