在 php 中获取 url 内容的安全性

Security of fetching a url content in php

我担心从 PHP 中的未知 url 获取内容的安全性。

我们基本上会使用 cURL 从用户提供的 url 中获取 html 内容,并查找 Open Graph 元标记,以将链接显示为内容卡片。

由于url是用户提供的,担心在这个过程中可能会被恶意代码感染

我还有一个问题:curl_exec真的会把完整的文件下载到服务器吗?如果是,那么使用 curl 时是否可能下载病毒或恶意软件?

使用 cURL 类似于使用 fopen()fread() 从文件中获取内容。 安全与否,取决于您对获取的内容所做的操作。

根据您的描述,您的服务器作为某种中介从获取的 HTML 内容中提取特定的子内容。 即使获取的内容包含恶意代码,您的服务器也不会执行它,因此不会对您的服务器造成伤害。

此外,因为您的服务器只提取特定的子内容(如您所说,Open Graph 元标记), 其他所有不是您在获取的内容中查找的内容都将被忽略, 这意味着您的用户会自动受到保护。

因此,在我看来,没有必要担心。 当然,这依赖于内容提取过程是可靠的假设。 应该有人看一下,确认一下。

does curl_exec actually download the full file to the server?

这取决于你所说的 "full file" 是什么意思。 如果你的意思是 "the entire HTML content",那么是的。 如果你的意思是"including all the CSS and JS files that the feched HTML content may refer to",那么就不是

is it possible that viruses or malware be downloaded when using curl?

答案是肯定的。 抓取的HTML内容可能包含恶意代码,但是,如果您不执行它,则不会对您造成伤害。

同样,我假设您的内容提取过程是正确的。

简短的回答是 file_get_contents 检索数据是安全的,甚至 curl 也是。如何处理这些数据取决于您。
几条准则:
1. 从不 运行 eval 该数据。
2.不要在没有过滤的情况下存入数据库
3. 甚至不要使用 file_get_contentscurl.

使用:get_meta_tags

array get_meta_tags ( string $filename [, bool $use_include_path = false ] )
// Example
$tags = get_meta_tags('http://www.example.com/');

您将在数组中解析和过滤所有元标记。

您可以使用 httpclient.class 而不是 file_get_content 或 curl。因为它通过 socket.After 下载数据连接页面,您可以使用 preg_match 获取元数据。

它是安全的,但您需要在使用前进行适当的数据检查。无论如何,您都应该输入任何数据。

扩展 Ray Radin 的答案。

预防措施提示

他是正确的,如果你使用声音一个声音过程来搜索获取的资源,那么获取任何提供的 url 应该没有问题。这里的一些例子是:

  • 不要将文件存储在网络服务器上的 public 面向目录中。然后你将自己暴露在这个被处决的环境中。
  • 不要将其存储在数据库中,这可能会导致二阶 sql 注入攻击
  • 一般来说,不要存储您请求的资源中的任何内容,如果您必须这样做,请使用您正在搜索的内容的特定白名单

查看header信息

即使没有简单的方法来验证您使用特定 url 请求的内容。有一些方法可以让您的生活更轻松,并防止一些潜在的问题。

例如 url 可能指向一个大的二进制文件、大图像文件或类似的东西。

先发起HEAD请求获取header信息。然后查看 Content-typeContent-length header 内容是否为 纯文本 html 文件

但是您不应该相信这些,因为它们可能会被欺骗。这样做将确保即使 non-malicous 内容也不会使您的脚本崩溃。请求图像文件可能是您不希望用户执行的操作。

Guzzle

我建议使用 Guzzle 来完成您的请求,因为我认为它提供了一些功能,应该可以使这更容易