У меня есть два сайта: один - это 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"];
?
Вы можете использовать государственную/частную пару. Простая версия будет выглядеть так:
//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
$_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 .
}
Вы можете проверить свойство $_SERVER['REFERER']
, но оно очень ненадежное/небезопасное.
Лучшим подходом было бы установить сайт B с помощью Basic Auth или что-то подобное, с которым вы можете аутентифицироваться, когда вы делаете запрос с сайта A. Затем вы можете добавить базовый auth к вашему запросу curl от A до B. B проверяет аутентификация, и, если это правильно, выполняется с остальной частью обработки.
Самый простой способ добиться этого - создать ключ, который знает сайт 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");
}