如何使用 PHP 安全地发送服务器回发?

How do I send a server postback safely with PHP?

我正在构建一个应用程序,它将向用户提供的 url(我希望..)发送一个 http 请求。

可能你们中的大多数人都知道这是回发、回调或网络挂接。

不过,我担心安全问题,因为其他服务器会发送响应。该响应可能包含代码或谁知道是什么。

到目前为止,我考虑过以下功能:

在不暴露安全漏洞的情况下最安全的方法是什么?

如果你不处理服务器的响应,无论如何你都没有安全问题。

例如,当您使用:

$url = 'http://www.example.com/testaddr';
$result = file_get_contents($url);
unset($result);

您有一个包含数据的变量。但这些数据尚未处理。

使用 cURL,您可以通过以下选项获得相同的方法:

$url = 'http://www.example.com/testaddr';
$curl = curl_init();                
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($curl);

//If you need to check result, use this:
if (!curl_errno($curl)) {
  $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  if ($http_code === 200) {
    echo "OK";
  } else {
    echo 'Unexpected HTTP code: ', $http_code, "\n";
  }
}
curl_close($curl);
unset($result);

在那种情况下是一样的,你在 $result var 上得到响应,但是,你没有使用它,在那种情况下,这不是安全故障。

此外,在这两种情况下,出于安全原因和防止过度内存使用,我在完成该过程后删除了 $result 变量。

如您在 PHP 文档中所见:

CURLOPT_RETURNTRANSFER TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly.

两个不同的级别

我认为您要解决两个不同级别的安全问题。您可能想要保护通信通道以避免有人欺骗 http 请求,并且您可能想要清理响应以避免讨厌的副作用。

保护 HTTP 请求

这部分很大程度上取决于目标服务器以及通信的处理方式。如果您可以强制执行 HTTPS,那么您可以非常安全地抵御 MITM 攻击。否则你总是容易受到欺骗。

清理响应

当您将响应返回到您的服务器时,这完全取决于您如何使用该数据。它与选择的功能没有太大关系,而是与您在调用后如何使用数据有关。 由于您允许用户以这种方式输入,所以只做最坏的打算。此时,最常见的清理输入的最佳实践适用:使用 PDO 进行数据库访问,使用 &#xHH; 转义字符。格式等等。

我希望这可以解决您的问题,否则请随时评论我的回答!