Как передать переменные с одного сайта на другой по http? Из базы в базу...

DanGien

Новичок
Как передать переменные с одного сайта на другой по http? Из базы в базу...

Не знаю, как к этому подступиться даже.

Есть сайт №1, там лежит база с переменными.

Есть сайт №2, там пустая база.

Надо запускать скрипт (самому или по крону), который берет из базы сайта №1 переменные и передает их на сайт №2. в его базу. Базы MySQL.

Причем, прямое подключение к базе MySQL не подходит, т.к. небезопасно это.

Придумал так. Сайт №2 имеет свой уникальный идентификатор KOD, который записан в базе сайта №1.

Скрипт из сайта №1 соединяется с файлом на сайте №2, передавая туда

- KOD этого сайта
- HTTP_HOST
- HTTP_REFERER
- все переменные

У сайта №2 в конфиге прописаны:

- KOD этого сайта
- какой сайт к нему будет соединяться (для сравнения с HTTP_HOST)
- какой скрипт будет с ним соединяться (для сравнения с HTTP_REFERER)

В результате происходит сравнение на стороне сайта №2 всех этих параметров, если все совпадает, то:

- сайт №2 получает переменные, переданные ему скриптом из базы сайта №1
- ну и далее вносит эти переменные к себе в базу.

Вот такой алгоритм. Не подскажете, как это реализовать? С помощью каких функций?

Как передать переменные от скрипта на одном сайте скрипту на другом?
 

Мутник

Новичок
а что то в таком виде не подходит?

PHP:
$url = http://www.siteA.ru/?param1=1&param2=2&param3=3;
а потом просто открывать нужный тебе сайт с таким линком.

А на сайте А ты обрабатываешь данный запрос и пишешь себе в базу данных какую то полученную инфу. !???
 

DanGien

Новичок
Автор оригинала: Мутник
а что то в таком виде не подходит?

PHP:
$url = [url]http://www.siteA.ru/?param1=1&param2=2&param3=3;[/url]
а потом просто открывать нужный тебе сайт с таким линком.
ПО КРОНУ так не выйдет, как я понимаю. Вот лежит себе файл otdam.php на сайте №1, ему надо взять из базы переменные и отдать на др. сайт. Как он так их выстроет?:) Это через веб-браузер можно, если я сам нажму на ссылку с параметрами... но кажется мне, что небезопасно это, вот так передавать, должен быть способ, чтобы в строке не светилось, а в переменной или массиве каком... в $_Post $_Get или что-то подобное...

А на сайте А ты обрабатываешь данный запрос и пишешь себе в базу данных какую то полученную инфу. !???
Есть сайт №1, сайта А нет:) Я спрашивал, не как обработать, а как тупо взять данные из базы на сайте №1 и передать их на сайт №2, пройдя авторизацию.

-~{}~ 15.03.05 02:12:

Автор оригинала: LeaetherStrip
не проще по SSL соединиться? :)
А если нет SSL?
 

LeaetherStrip

Новичок
Гы.. ну тогда попробуй сам закриптовать данные (ключик-то ты можешь на оба сервера положить? :) ).

$data = "some_data_in_your_format";
$str = crc32($data).$data; // для секьюрности, добавляем чексумму к данным, а при расшифровке проверяем

потом шифруешь $str любым алгоритом.. собсна и все ;-) если ты, конечно, уверен, что данные в URL поместятся
 

DanGien

Новичок
А вот не уверен :)

Вычитал в словах - можно делать имитацию формы post и потом это отправлять на др. сайт. Все данные будут в своих переменных. Через fsockopen, к примеру... А как сделать все это в коде?
 

LeaetherStrip

Новичок
Ну это просто.. curl наш метод :)
http://ru2.php.net/manual/ru/ref.curl.php

Если и курла нет - см. первый сверху комент на той же странице :) Вообще, коменты -штука крайне полезная.

Кстати, POST ничуть не секьюрней GETа. Криптование все равно пригодится
 

LeaetherStrip

Новичок
ТАКАЯ кривая передача, как в первом посте - разумеется, не безопасней :)
 

Paxan

Новичёк
DanGien
Делай прямое соединение с базой с сайта №1 на сайт №2 и не городи этот огород. На сайте №2 создай юзера, который может получить доступ только с хоста №1 и будет тебе счастье.
 

DanGien

Новичок
Автор оригинала: LeaetherStrip
Ну это просто.. curl наш метод :)
http://ru2.php.net/manual/ru/ref.curl.php

Если и курла нет - см. первый сверху комент на той же странице :) Вообще, коменты -штука крайне полезная.

Кстати, POST ничуть не секьюрней GETа. Криптование все равно пригодится
Спасибо за ссылочку, обратил внимание на первый коммент - именно это я и искал!:) Только все равно там не все понятно...

Переменные свои я передал, скрипт получил, отлично!

Но мне бы еще получить

- HTTP_HOST
- HTTP_REFERER

вместе с переменными, чтобы сравнить на сайте №2 - мой это скрипт все послал или нет. А вот КАК их получить?

Пишу в скрипте-приемнике

$text = $_POST['email']; //сработало, переменная $email переслалась

$server = $_SERVER["HTTP_REFERER"]; //Не срабатывает, нет реферера.

Как сие получить?

Заране большой сенкс!

-~{}~ 15.03.05 16:13:

Для перемылки данных использую...

function HTTP_Post($URL,$data, $referrer="") {

// parsing the given URL
$URL_Info=parse_url($URL);

// Building referrer
if($referrer=="") // if not given use this script as referrer
$referrer=$_SERVER["SCRIPT_URI"];

// making string from $data
foreach($data as $key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);

// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;

// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
$request.="Host: ".$URL_Info["host"]."\n";
$request.="Referer: $referer\n";
$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="\n";
$request.=$data_string."\n";

$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp, $request);
while(!feof($fp)) {
$result .= fgets($fp, 128);
}
fclose($fp);

return $result;
}

$output1=HTTP_Post("http://www.server1.com/script1.php",$_POST);

-~{}~ 15.03.05 17:12:

Другими словами, если я запускаю по крону один php-скрипт, как он может передать другому параметры "откуда он пришел" и "как его имя - имя файла"?
 

LeaetherStrip

Новичок
Гм.
Не знаю, почему курл не передает реферера (вроде ты его в заголовках явно прописываешь). Не вникал в тонкости :) Проверь, точно ли он правильно подставляется _в запрос_

Вообще, послушай доброго совета. Не связывайся с реферером. Не с той стороны ворота городишь :)

Используй шифрование. Склей данные в одну строку, зашифруй, отошли -> получи, расшифруй, разбери строку ;) С шифрованим в PHP проблем нет, и это надежней.

До кучи, можно еще к определенному IP сервера-отправителя привязаться. Надеюсь, как в получателе узнать IP отправителя, знаешь? :)
 

DanGien

Новичок
LeaetherStrip, уже все работает, спасибо за ответ! Именно так и сделал, привязал к IP + еще несколько хитростей по авторизации :)

Но данные не шифрую... но заставил задуматься, скажем, если все данные передаются в одном массиве _Post, то как зашифровать и расшифровать сей массив? Главный критерий - быстрота и универсальность шифровки/расшифровки
 

LeaetherStrip

Новичок
Не шифруй $_POST. Засунь в $_POST один-единственный параметр. В него положи вот что:

$post_params['oneandonly_param'] = my_crypt(serialize($all_data_i_want_to_send));

Зашифрованный сериализованный массив (см. serialize() в мануале)

На стороне получателя - все наоборот

$all_data_i_received = UNserialize(my_UNcrypt($_POST['oneandonly_param']));

См. мануал по serialize() и unserialize() - оч. полезные функции

См. http://ru2.php.net/manual/ru/ref.mcrypt.php - как написать my_crypt() и my_uncrypt() :) Особенно коменты - наверняка там все есть.

100% защиты, разумеется, не гарантирует, но все же :)
 

DanGien

Новичок
Спасибо, вот нашел

----------------------------------------------------------------------------
function encrypt($string, $key)
{
$result = '';
for($i=1; $i<=strlen($string); $i++)
{
$char = substr($string, $i-1, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return $result;
}

function Decrypt($string, $key)
{
$result = '';
for($i=1; $i<=strlen($string); $i++)
{
$char = substr($string, $i-1, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return $result;
}

----------------------------------------------------------------------------

Только я не понял, что тут значит $string, $key ?

Вот есть у меня переменные $perem1, $perem2 ...

я их объединяю в массив

$data = array ($perem1, $perem2);

Далее

$post_params['oneandonly_param'] = encrypt(serialize($data));

Далее помещаю в $_POST

$_POST['myparam'] = $post_params['oneandonly_param'];

Так?

Так ведь encrypt работать не будет. Как тут модифицировать код функции encrypt и Decrypt?

-~{}~ 22.03.05 02:06:

ДОШЛО С ФУНКЦИЯМИ!

-~{}~ 14.04.05 02:34:

Подскажите, плиз, у меня на компе все работает, закачал на сервер, не хочет :mad:

В общем, перед передачей данные шифруются:

$params['mypost_param'] = encrypt(serialize($alldata),$key);
$_POST['param'] = $params['mypost_param'];

и отправляются...

Удаленный скрипт все это принимает, смотрю - переменная $_POST['param'] передается в зашифрованном виде - точно такая же, как от передающего скрипта, все идентично.

Но далее скрипт расшифровывает:

$mydata = UNserialize(Decrypt($_POST['param'],$key));

В результате $mydata пустая абсолютно :mad:

Что на сервере может быть не так, что не срабатывает эта команда? Подскажите, плиз...


-~{}~ 14.04.05 02:58:

Я даже упрощу вопрос - как узнать, что есть в массиве на сервере? и есть ли там что-то?

Что-то странное с массивами на сервере. У меня на компе если пишу

$perem = $masiv; // $perem = array

а на сервере просто пустая строка.

Если у себя пишу на компе

$perem = $masiv[0]; //выдается значение переменной в массиве

то на сервере снова пустая строка выдается. Да, на сервере юзается MysQL 4, а у меня на компе 3 (Денвер). Вот и вся разница...

-~{}~ 14.04.05 03:29:

Вот что еще выяснил. На стороне сервера при команде

$vot1 = Decrypt($_POST['param'],$key);

Все отлично, запись дешифруется, только идет со вставками левыми (после serialize, надо полагать, как писал выше
LeaetherStrip).

А вот когда я делаю после этого

$vot1 = UNserialize ($vot1);

Выдается вместо $vot1 - пустая строка вообще. Вот такая загадка:)
 

Kelkos

Сам себе программер
Выдается вместо $vot1 - пустая строка вообще. Вот такая загадка
Городишь огород. Может хватит издеваться над бедным рнр?
Лучший вариант (как уже тебе деликатно намекали) это предоставления доступа к базе со второго сервера..
Далее.. нефига непонятно - отчего ты там пытаешься "защититься" всякими жуткими функциями? От перехвата трафика? хех..
У тебя вообще в чём проблема то? Правильно идентифицировать второй сервер, присылающий запрос, или переслать результат на второй сервер? Во всей каше твоих постов так и не понял. Большой проблемы здесь нет в принцыпе, ктоме той, что ты сам себе сделал.
Ты кашу прожуй и спроси внятно.
 

tolst

Новичок
Скрипт на сайте A:
PHP:
<?php
if ($secret_key == "abcdef"){
mysql_query($sql);
echo "OK";
} else {
exit("Вы не можите :)");
}
?>
Скрипт на сайте B, с которого нужно перенести:
PHP:
<?php
$addr = "secret_key=abcdef&sql=INSERT INTO...";
$url = "URL к скрипту А";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $addr);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if (curl_error($ch)) echo '<p>'.curl_error($ch).'</p>';
curl_close($ch);

?>
Этот пример если соединение через SSL
Смысл: ты просто посылаеш другому скрипту SQL, он его выполняет...
 

DanGien

Новичок
Kelkos, функци не жуткие, народ пользует (как написано выше, почти все взято с сайта php.net), так что не все так страшно :) Тем более, что передача то идет! И приходит! Не работает только почему-то UNserialize на стороне сервера. Вот я и спрашиваю, почему она может не работать?

tolst, все же у меня надежнее, идентификация не только по secret_key + еще и шифрование. И это работает :)

P.S. А нестандартные скрипты труднее ломать:)

-~{}~ 14.04.05 09:53:

А соединение без SSL...
 

tolst

Новичок
DanGien
Да я тебе не про надёгу говорю, а про алгоритм.... твой код не надёжнее... если будут подбирать, то одинаково подберут и твой вариант и мой... поставь побольше символов в secret_key и всё...

-~{}~ 14.04.05 10:32:

PHP:
$cu = curl_init(); 
curl_setopt($cu, CURLOPT_URL, $url); 
curl_setopt($cu, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
curl_setopt($cu, CURLOPT_REFERER, "http://www.referer.ru"); 
curl_setopt($cu, CURLOPT_POST, 1); 
curl_setopt($cu, CURLOPT_POSTFIELDS, $vars); 
curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($cu, CURLOPT_TIMEOUT, 10); 
$output = curl_exec($cu); 
curl_close($cu);
Этот пример без использования SSL
 
Сверху