使用Curl安全地访问其他服务器上的数据

lztngnrs  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(151)

我想在我的插件中验证许可证。
用户在他的网站上输入令牌(由我提供),我想通过使用curl联系我的服务器来验证这一点。
例如,
插件中的代码:

function curl_url( $url ) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url );

    $cr = curl_exec($ch);

    curl_close($ch);

    return $cr;
}

$confirm = 'https://my-website.com/some_folder/some_file.php?token=' . $token;

$response = json_decode( curl_url( $confirm ) );

在我的网站上的代码some_file.php:

if(isset($_GET['token'])){
    validate();  

}

function validate(){
    $token= $_GET['token'];
    //check if valid, provide response...
}

我的问题:
1.这是个多好多坏的办法,你给我什么建议?
1.什么是一些高级用户看到我的插件中的代码,然后使用此URL进行一些恶意攻击?
https://my-website.com/some_folder/some_file.php

jyztefdp

jyztefdp1#

目前,如果我尝试从另一个域访问我的服务器,我没有得到任何错误和请求工作,所以我不知道为什么我需要CURLOPT_CAINFO. - Toniq
比较两个域之间的结果。
curl_getinfo非常有用。

CURLINFO_HEADER_OUT
echo curl_getinfo($ch,CURLINFO_HEADER_OUT);

其他有用的 curl 信息。

CURLINFO_SSL_VERIFYRESULT
CURLINFO_HTTPAUTH_AVAIL
CURLOPT_HTTPAUTH the HTTP authentication method(s) to use.
CURLINFO_SSL_ENGINES
CURLINFO_CERTINFO true to output SSL certification information to STDERR on secure transfers
CURLINFO_APPCONNECT_TIME

选项

CURLOPT_UNRESTRICTED_AUTH
CURLOPT_SSLVERSION Your best bet is to not set this and let it use the default. 
CURLOPT_SSL_OPTIONS
CURLOPT_KEYPASSWD
CURLOPT_PINNEDPUBLICKEY
CURLOPT_SSH_PRIVATE_KEYFILE 
CURLOPT_CAPATH A directory that holds multiple CA certificates
CURLOPT_CAINFO The name of a file holding one or more certificates to verify the peer with. 
CURLOPT_SSL_VERIFYHOST 0 to not check the names. 1 should not be used. 2 to verify that a Common Name field 
CURLOPT_SSL_VERIFYPEER  false to stop cURL from verifying the peer's certificate. 
CURLOPT_SSL_VERIFYSTATUS  true to verify the certificate's status. 
CURLOPT_CERTINFO true to output SSL certification information to STDERR on secure transfers. 
CURLOPT_FRESH_CONNECT   true to force the use of a new connection instead of a cached one. 
CURLOPT_SSL_ENABLE_NPN
CURLOPT_SSL_ENABLE_ALPN
CURLOPT_SSL_FALSESTART  true to enable TLS false start. 
CURLOPT_SSH_AUTH_TYPES
CURLOPT_LOGIN_OPTIONS
CURLOPT_SSL_CIPHER_LIST
CURLOPT_SSLCERTPASSWD
CURLOPT_SSLKEY
CURLOPT_SSLENGINE
CURLOPT_SSLKEYPASSWD
CURLOPT_SSLKEYTYPE
CURLOPT_SSL_CIPHER_LIST
CURLOPT_SSH_PRIVATE_KEYFILE
CURLOPT_SSH_PUBLIC_KEYFILE
CURLOPT_USERNAME
CURLOPT_PASSWORD
CURLOPT_USERPWD [username]:[password]
CURLOPT_XOAUTH2_BEARER  Specifies the OAuth 2.0 access token. 

CURLOPT_VERBOSE
CURLOPT_STDERR  A file handle to output errors to instead of STDERR. 
$errno = curl_errno($ch)
$error_message = curl_strerror($errno);

您应该检查错误。

CURLOPT_VERBOSE
CURLOPT_STDERR  A file handle to output errors to instead of STDERR. 
$errno = curl_errno($ch)
$error_message = curl_strerror($errno);

CURLE错误代码

CURLE_SSL_CONNECT_ERROR (35)
CURLE_SSL_ENGINE_NOTFOUND (53)
CURLE_SSL_ENGINE_SETFAILED (54)
CURLE_SSL_CERTPROBLEM (58)
CURLE_SSL_CIPHER (59)
CURLE_PEER_FAILED_VERIFICATION (60)
CURLE_SSL_ENGINE_INITFAILED (66)
CURLE_LOGIN_DENIED (67)
CURLE_SSL_CACERT_BADFILE (77)
CURLE_SSH (79)
CURLE_SSL_CRL_BADFILE (82)
CURLE_SSL_ISSUER_ERROR (83)
CURLE_SSL_PINNEDPUBKEYNOTMATCH (90)
CURLE_SSL_INVALIDCERTSTATUS (91)
CURLE_AUTH_ERROR (94)
CURLE_SSL_CLIENTCERT (98)

你能提供这个标题的例子吗?- Toniq
将页眉添加到 curl :

$token = 'token';
$request = array();
$request[] = "X-Token: $token";
curl_setopt($ch, CURLOPT_HTTPHEADER, $request);

当服务器收到时:

Content-Length: 55098
Content-Type: application/x-www-form-urlencoded
Connection: close
X-Token: token

服务器读取头的代码:

foreach (getallheaders() as $key=> $value) {
   $header[$key] = $value;
}
$token = $header['X-Token'];

看起来你可能是在你的头上。你应该知道这考虑到你正在尝试做什么。这是非常容易的一部分。你仍然需要处理SSL(CURLOPT_CAINFO)。
您可能需要指定SSL证书或CA的路径。
来自PHP手册的curl_setopt页面
可以使用CURLOPT_CAINFO选项指定要验证的备用证书,或者使用CURLOPT_CAPATH选项指定证书目录。
在url脚本中,尝试以下代码以获取请求的详细信息。
它应该可以帮助您找到请求中的问题。
我已经用了很多年了,它帮助了我很多次。
我把这段代码复制了一个PHP脚本,下面就是这个脚本。
您可以使用此链接作为您的curl URL。
LINK to the code below

<?php
header('Content-Type: text/plain; charset=UTF-8');
$decode = false;
foreach (getallheaders() as $name => $value) {
    if(strpos($value,'urlenc')){$decode = true;};
    echo "$name: $value\n";
}
echo "\nBODY\n";
$body = file_get_contents('php://input');
//if($decode){$body = urldecode($body);}
echo $body;

echo "\n\n\$_SERVER['QUERY_STRING'])\n";
echo urldecode($_SERVER['QUERY_STRING']);
echo "\n\nargv\n";
foreach($_SERVER['argv']as $key=>$value){
  echo "\n$key = " . urldecode($value) . "\n";
}
echo "\n\$_POST\n";
var_export($_POST);

echo "\n\$_GET\n";
var_export($_GET);

echo "\n\$_REQUEST\n";
var_export($_REQUEST);

echo "\n\$_FILES\n";
var_export($_FILES);
echo "\n\$_SERVER\n";
var_export($_SERVER);
exit;

相关问题