Как аутентифицировать пост, используя curl?

0

У меня есть два сайта: один - это a.com, другой - b.com. Я передаю данные с помощью curl с сайта a.com на b.com, я успешно могу передавать данные, но проблема в том, что я хочу сделать его более безопасным, чтобы сайт b.com после проверки того, что сообщение было с сайта a.com.Как получить это?

Код на сайте a.com

<?php
  $some_data = array(
    'message' =--> 'Hello World',
    'name' => 'Chad'
  ); 

  $curl = curl_init();
  // You can also set the URL you want to communicate with by doing this:
  // $curl = curl_init('http://localhost/echoservice');

  // We POST the data
  curl_setopt($curl, CURLOPT_POST, 1);
  // Set the url path we want to call
  curl_setopt($curl, CURLOPT_URL, 'http://localhost/b.com'); 
  // Make it so the data coming back is put into a string
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  // Insert the data
  curl_setopt($curl, CURLOPT_POSTFIELDS, $some_data);

  // You can also bunch the above commands into an array if you choose using: curl_setopt_array

  // Send the request
  $result = curl_exec($curl);
  // Free up the resources $curl is using
  curl_close($curl);

  echo $result;
?>

Код на B.com

//I want to check here that the request was from a.com ,if it is ensured then i want to do //the rest of the work
  echo 'Your message was: ' . $_REQUEST["message"] . ' and your name is: ' . $_REQUEST["name"];
?
  • 0
    использовать SSL, тогда вы можете проверить сертификаты на обоих концах.
  • 0
    Создание хэшированного значения (случайной строки), которое знают оба сайта, также поможет с безопасностью.
Теги:
curl

4 ответа

0

Вы можете использовать государственную/частную пару. Простая версия будет выглядеть так:

//a.com

$keys  = array(
   'publicKey1' => 'privateKey1',
   'publicKey2' => 'privateKey2',
    //...
   'ksjdlfksjdlf' => '989384kjd90903@kjskdjdsd'
);
$publicKeys = array_keys($keys);
//get a random key from pool
$publicKey  = $publicKeys[rand(0, count($publicKeys))];
$privateKey = $keys[$publicKey];

//your data...
$some_data = array(
   'message' => 'Hello World',
   'name' => 'Chad'
);     

/*generate a verification code from data...*/
//add public key to data
$some_data['key'] = $publicKey;
//sort data (to always generate same verification code regardless of params order)
uksort($some_data);

//generate code with your private key
$verificationKey = sha1($privateKey . http_build_query($some_data) . $privateKey);

//add verification code to sent data
$some_data['verification_code'] = $verificationKey;

//send data
curl_exec(...);

и на b.com:

$keys = "same keys that exist on a.com";
if (!isset($_POST['key']) || !isset($_POST['verification_code']) || !isset($keys[$_POST['key'])) {
    //do something to handle invalid request
}

$verificationKey  = $_POST['verification_code'];    
$privateKey       = $keys[$_POST['key']];

//remove verification code from data
unset($_POST['verification_code']);
//sort data
uksort($_POST);

$checkKey = sha1($privateKey . http_build_query($_POST) . $privateKey);

//validate key
if ($checkKey != $verificationKey) {
   //handle invalid data
}

//verified. do something with $_POST
0

$_SERVER['REMOTE_ADDR'] будет решением

if($_SERVER['REMOTE_ADDR']=="IP OF A.com"){

//exec code
}else{
log_error($_SERVER['REMOTE_ADDR'] has tried to access B.com at date());//that an ex .
}
  • 0
    В простой ситуации это может сработать. Однако это может стать очень сложным, когда вы начнете добавлять несколько серверов с любой стороны, добавлять прокси-сервер или балансировщик нагрузки здесь и там и т. Д. Аутентификация на основе токенов может быть более гибкой и простой в масштабировании.
0

Вы можете проверить свойство $_SERVER['REFERER'], но оно очень ненадежное/небезопасное.

Лучшим подходом было бы установить сайт B с помощью Basic Auth или что-то подобное, с которым вы можете аутентифицироваться, когда вы делаете запрос с сайта A. Затем вы можете добавить базовый auth к вашему запросу curl от A до B. B проверяет аутентификация, и, если это правильно, выполняется с остальной частью обработки.

0

Самый простой способ добиться этого - создать ключ, который знает сайт a.com, и сайт b.com знает.

Затем вы можете передать ключ с одного сервера на другой с помощью завитка, и пока знаете, что кто-то еще знает, к какому ключу они не смогут получить доступ к нему (при условии, что вы запрограммируете его таким образом).

Так работает большинство API, таких как Facebook, Twitter, Linkedin и т.д.

Ваши данные будут выглядеть так, например (a.com):

$some_data = array(
    'message' =--> 'Hello World',
    'name' => 'Chad',
    'key' => '4h9rj8wj49tj0wgj0ejwrkw0jt0ekv0ijspxodxk9rje0rg9tskvep9rrgt9wkrgte'
); 

Затем на b.com вы просто выполните следующее:

if(!isset($_POST['key']) && $_POST['key'] != '4h9rj8wj49tj0wgj0ejwrkw0jt0ekv0ijspxodxk9rje0rg9tskvep9rrgt9wkrgte'){
    die("Invalid Key");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню