如何使用 PHP 安全地发送服务器回发?
How do I send a server postback safely with PHP?
我正在构建一个应用程序,它将向用户提供的 url(我希望..)发送一个 http 请求。
可能你们中的大多数人都知道这是回发、回调或网络挂接。
不过,我担心安全问题,因为其他服务器会发送响应。该响应可能包含代码或谁知道是什么。
到目前为止,我考虑过以下功能:
- Curl()
- file_get_contents()
在不暴露安全漏洞的情况下最安全的方法是什么?
如果你不处理服务器的响应,无论如何你都没有安全问题。
例如,当您使用:
$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 进行数据库访问,使用 HH; 转义字符。格式等等。
我希望这可以解决您的问题,否则请随时评论我的回答!
我正在构建一个应用程序,它将向用户提供的 url(我希望..)发送一个 http 请求。
可能你们中的大多数人都知道这是回发、回调或网络挂接。
不过,我担心安全问题,因为其他服务器会发送响应。该响应可能包含代码或谁知道是什么。
到目前为止,我考虑过以下功能:
- Curl()
- file_get_contents()
在不暴露安全漏洞的情况下最安全的方法是什么?
如果你不处理服务器的响应,无论如何你都没有安全问题。
例如,当您使用:
$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 进行数据库访问,使用 HH; 转义字符。格式等等。
我希望这可以解决您的问题,否则请随时评论我的回答!