2013-10-14 3 views
1

Я создаю приложение для синхронизации локальной базы данных mysql с удаленной базой данных mysql, поэтому я создаю файл дампа, отправляя его через sFTP, а затем выполняю его на сервер.ssh или cURL для отправки данных на удаленный сервер

Однако, я знаю, что существуют другие доступные методы, такие как cURL. Мне нравится отправлять данные на удаленный сервер и выполнять его на сервере, когда он принят (ИСТИНА), но я мало знаю о проблемах безопасности, связанных с использованием cURL в этом отношении. Может ли кто-нибудь посоветовать решение cURL, иначе предложите альтернативные методы?

+0

сделал одно из наших ответов помочь? ** Вы нашли решение? ** – Jimbo

ответ

3

Во-первых, вместо создания файла дампа, вы должны прочитать данные из файла с помощью file_get_contents(), fread() и т.д.

магазин результат этого в переменной, а затем отправить, что исходные данные по трубопроводу (через cURL, если хотите), и вместо этого код на стороне сервера генерирует файл дампа.

Используя cURL, вы можете указать файл приватного сертификата для аутентификации - так что безопасность этого будет такой же, как использование сертификата по ssh, - это не то, о чем вам нужно беспокоиться.

Вы можете установить файл PEM со следующими Curl примерами опций:

curl_setopt($ch, CURLOPT_SSLCERT, $pemfile); 
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile); 

Есть учебники для прежде всего через Интернет. Используйте аутентификацию с использованием секретного ключа, и ваши проблемы безопасности сортируются. Просто убедитесь, что вы не установили CURLOPT_SSL_VERIFYPEER в false (вы не хотите, чтобы какой-либо игрок MiTM (человек посередине) теперь атакует вас).

1

Я использую Curl для этого.

У меня есть сценарий экспорта, который генерирует json или xml (зависит от того, какое настроение у меня больше всего на свете). Затем я отправляю этот файл на удаленный сервер, а удаленный сервер использует ignore_user_abort, так что обработка может продолжаться, даже если внутренний скрипт родительской системы истекает/завершает все.

Работает как синхронизация шарма, изменяется на таблицу 2.6gb между локальным веб-сервером и удаленным веб-сервером.

+0

Что вы думаете о безопасности? нам нужно что-то еще для этого? – underscore

+0

Его просто стандартный пост http, но если вы поместите https на удаленный сервер, тогда вы получите шифрование от конца до конца. Вы также можете реализовать простое шифрование своих собственных почтовых зашифрованных данных между двумя страницами, а не только данными json/xml. Но реально даже большой файл будет иметь размер в несколько сотен K, поскольку его единственным простым текстом является фактическое время публикации в открытом состоянии настолько мал, что вовремя к обычной загрузке веб-страницы, если кто-то активно нюхает ваши серверные сети с обоих концов, у вас нет проблем с безопасностью. Если сеть обнюхивает, тогда у вас возникают большие проблемы – Dave

0

Я использую phpseclib, чистую реализацию PHP SFTP, чтобы делать такие вещи. например.

<?php 
include('Net/SFTP.php'); 

$sftp = new Net_SFTP('www.domain.tld'); 
if (!$sftp->login('username', 'password')) { 
    exit('Login Failed'); 
} 

$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE); 
?> 

Он имеет ряд преимуществ по сравнению с libssh2, включая скорость и портативность:

http://phpseclib.sourceforge.net/ssh/compare.html

0

Это базовое решение с использованием ssh2/libssh.

Этот код предполагает, что у вас уже есть способ создания дампа базы данных и будет просто читать его на текущем сервере с целью его загрузки на удаленном сервере.

Он подключается к удаленному хосту через SSH, записывает ваш sql_dump в файл на удаленном сервере, а затем выполняет команду для его загрузки в базу данных.

Я бы не рекомендовал хранить имя пользователя и пароль для подключения, это просто быстрый способ проверить код. Вы бы лучше с помощью ssh2_auth_pubkey_file для аутентификации: http://php.net/manual/en/function.ssh2-auth-pubkey-file.php

// remote host authentication details. hostname/ip, user, pass 
$host = 'REMOTE_HOST'; 
$user = 'REMOTE_USER'; 
$pass = 'REMOTE_PASS'; 

// check if we have ssh2 installed first 
if (function_exists("ssh2_connect")) { 

    //connect to remote host 
    $connection = ssh2_connect($host, 22); 

    // if connection successful, proceed 
    if ($connection) { 

     // authenticate on remote connection 
     $auth = ssh2_auth_password($connection, $user, $pass); 

     // if we have authenticated, proceed with remote commands 
     if ($auth) { 

      // load our dump file to a string 
      $sql_str = file_get_contents('dump_file.sql'); 
      // bash command to cat our dump string to a file 
      $write_remote_file_command = "cat <<'EOF' > /home/tmp_file.sql \n$sql_str \nEOF"; 
      // call our execute ssh function to execute above command 
      executeSSHCommand($connection, $write_remote_file_command); 

      // command to load our temp dump file into the database 
      // - you may need to add additional commands to drop the existing db, etc 
      $remote_load_command = "mysql -Uroot -p -h localhost database_name < /home/tmp_file.sql"; 
      // remotely execute load commands 
      executeSSHCommand($connection, $remote_load_command); 
     } 
    } 
} 

// basic function to execute remote shell commands via our authenticated $connection 
function executeSSHCommand($connection, $command) { 

    $output = array(); 
    $ssh_data = ""; 

    $stream = ssh2_exec($connection, $command); 

    if ($stream) { 

     stream_set_blocking($stream, true); 

     while ($buffer = fread($stream, 65536)) { 

      $ssh_data .= $buffer; 
     } 

     fclose($stream); 

     $output = explode(PHP_EOL, $ssh_data); 

    } 

    return $output; 
} 
Смежные вопросы