首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过在PHP中传递URL来防止SSRF?

如何通过在PHP中传递URL来防止SSRF?
EN

Stack Overflow用户
提问于 2016-03-09 15:40:47
回答 1查看 3.7K关注 0票数 2

在使用Acunetix扫描代码以查找vunerabilities之后,下面的脚本出现了问题:

“对域hit0yPI7kOCzl.bxss.me启动了HTTP请求,这表明此脚本容易受到SSRF (服务器端请求伪造)的攻击。”

我怎么才能阻止这一切?

代码语言:javascript
复制
<?php
$filename = strip_tags($_GET['url']);

if (substr($filename,0,4) !== 'http') {
    die("Need a valid URL...");
}

$ext = pathinfo($filename, PATHINFO_EXTENSION);


switch ($ext) {
    case "gif":
        header('Content-Type: image/gif');
        readfile($filename);
        break;
    case "png":
        header('Content-Type: image/png');
        readfile($filename);
        break;
    case "jpg":
    default:
        header('Content-Type: image/jpeg');
        readfile($filename);
        break;
}
?>
EN

回答 1

Stack Overflow用户

发布于 2016-03-14 13:22:49

源如果在您的情况下问题是您的服务器将尝试从任何传递的url中获取数据。由于它有http://google.com内部的url参数,脚本将响应实际的谷歌网站内容。

为什么不好?例如,可以利用该漏洞绕过防火墙设置、访问服务器的内部网络或污染套接字连接,从而使您的服务器无法连接或连接到服务器,并且无法响应。

首先,如果您真的想用PHP提供静态文件,那么您应该考虑一下。最有可能的情况是,这项责任可以委托给web服务器。它甚至可能“服务”静态从第三方网站与当前的网络服务器,所以你应该认真考虑摆脱该代码。

如果您100%确定在这种情况下要与PHP一起使用,则应该在代码中添加限制。

  1. 添加域白名单,以便只允许在url变量中使用可信域列表;
  2. 不要处理扩展名未知的文件。

在这种情况下,代码将如下所示:

代码语言:javascript
复制
<?php

$whitelist = [
    'some.whitelisted.com',
    'other.whitelisted.com'
];

$extensionMap = [
    'gif'  => 'image/gif',
    'png'  => 'image/png',
    'jpg'  => 'image/jpeg',
    'jpeg' => 'image/jpeg'
];

$filename = strip_tags($_GET['url']);

$host = parse_url($filename, PHP_URL_HOST);

if(empty($host) || !in_array($host, $whitelist)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

$ext = pathinfo($filename, PATHINFO_EXTENSION);

if(!isset($extensionMap[$ext])) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

header(sprintf('Content-Type: %s', $extensionMap[$ext]));
readfile($filename);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35896093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档