2012-06-21 4 views
3

Я разрабатываю настольное приложение на C#, которое необходимо подключить к моей онлайн-базе данных mysql. Я попытался предоставить доступ в панели управления «%», что означает любой IP-адрес, но он не работает. Может быть, хостинг-провайдер (bigrock) не позволяет этого.Подключение к удаленной базе данных mysql с API

В качестве альтернативы, я пытаюсь написать код в Интернете на PHP, который получит параметр «sql» в качестве параметра и возвращает выход в формате JSON с помощью json_encode.

Есть ли альтернативные методы, которые лучше подходят.

+2

Внесение учетных данных в приложение - плохая идея. Почему бы не написать сервер или интерфейс с веб-сервером для каких-либо запросов? Самое главное, зачем вам приложение для подключения к базе данных? –

+1

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

+0

Я согласен с @Elzo Valugi У меня была та же проблема, и я решил ее связаться со своим провайдером. – HichemSeeSharp

ответ

2

Какая ошибка возникает при попытке подключения? Тайм-аут = межсетевой экран; Permission denied = permissions not right и т. Д.

Одним из решений является создание прокси с запрограммированными запросами (давайте тогда будем называть «хранимые процедуры») - вы можете сказать «Запустить запрос 5, параметры A, B и C», , Поскольку это будет сервер-сервер (не общедоступный), вам просто нужно добавить некоторую базовую систему аутентификации (например, общий вращающийся ключ, контрольную сумму с использованием параметров и т. Д.), Но также обеспечить, чтобы запросы не были опасны, если на него были выброшены какие-либо параметры.

Дисклеймер: Это решение, но я не рекомендую, чтобы я сделал это, если вы не уверены, что это безопасно!

+0

Я получаю разрешение denied error – AjayR

+1

В этом случае ваши учетные данные ошибочны и сервер не защищен брандмауэром. Это указывает на то, что у вас должны быть разрешения на подключение удалённо - проверьте свой хост. – Robbie

0

Я хотел бы сделать следующее:

Создайте пользователя с хозяином вашего общественного IP (www.whatismyip.com).

Если это не сработает, создать пользователь с вашим хозяином в качестве общедоступной записи ARPA/PTR:

>nslookup 
> set q=ptr 
> 8.8.8.8 

Non-authoritative answer: 
8.8.8.8.in-addr.arpa name = google-public-dns-a.google.com 

8.in-addr.arpa nameserver = ns1.Level3.net 
8.in-addr.arpa nameserver = ns2.Level3.net 

Хост затем будет установлен в google-public-dns-a.google.com.

Вторая работала, и я не уверен, почему для меня в проекте, над которым я работал в прошлом, где вы могли бы подумать, что IP-адрес достаточен.

0

Я не уверен, что у вас есть root-доступ или доступ к my.cfg. Если вы можете отредактировать его, убедитесь, что строка «skip-networking» прокомментирована или удалена и содержит строку «bind-address = *». Перезагрузите mysql после редактирования config.

+0

Как упоминалось в drew010, не рекомендуется подключать пользователя из любого места. Но вы не можете указать более 1 «связывание-адрес» в конфигурации MySQL (вы действительно можете, но последним указанным будет предпочтительнее). Поэтому я бы оставил «bind-address = *», но установил права доступа для пользователя только с указанного IP. – Tim

1

Я бы посоветовал вам не создавать подстановочных знаков, которые могут подключаться к базе данных из любого места, используя встроенные учетные данные MySQL в вашем приложении. Плохая идея.

Было бы очень легко определить учетные данные, используемые вашим приложением, а затем злоумышленник мог напрямую подключиться к вашему серверу БД и начать выпуск запросов к вашей базе данных.

Они смогут выпустить SELECT заявления для любой информации в ваших таблицах, даже информацию, которую они не должны видеть. Затем становится намного проще использовать любые известные или неизвестные уязвимости в MySQL намного проще, так как теперь они имеют консольный доступ и могут отправлять данные непосредственно на сервер. Если у учетной записи есть привилегия DELETE, они могут стереть все данные в вашей таблице (таблицах).

Кроме того, наличие PHP-скрипта, который выдает запросы, предоставленные приложением/конечным пользователем, не является идеальным, поскольку все еще можно свободно выдавать запросы. Хотя этот вариант лучше, чем предоставление полного доступа к удаленному пользователю, это все еще плохая идея.

Путь к удалению будет заключаться в том, чтобы идентифицировать всю информацию, которая требуется для доступа к C# -приложению, а также как и написать простой веб-сервис/API, который будет получать параметры и выдавать свои собственные запросы и возвращать результаты с использованием XML , JSON или даже SOAP. Постарайтесь как можно больше абстрагировать доступ к базе данных из внешнего мира для обеспечения лучшей безопасности.

Надеюсь, что это поможет.

0

По соображениям безопасности вы не должны обращаться к базе данных непосредственно через (общедоступную) сеть.

Один из способов - написать php-скрипт на сервере базы данных и получить к нему доступ через HTTP/POST.

Вы должны аутентифицировать клиента через имя пользователя и хешированный пароль. Данные, которые вы отправляете, должны быть зашифрованы (например, с помощью текстового пароля пользователя). Не отправляйте полные запросы, только то, что вы хотите сделать, и параметры. В качестве примера, вы хотите заказы для клиентов, вы можете отправить запрос на запись со следующими параметрами пользователя = азбука, пароль = 9151440965cf9c5e07f81eee6241c042a7b78e9bb2dd4f928a8f6da5e369cdffdd2b70c70663ee30d02115731d35f1ece5aad9b362aaa9850efa99e3d197212a, данные = EncryptedData

Вы можете заметить, что пароль является SHA512 Хэш.

Данные могут быть JSON или что-нибудь еще: { "Команда": "GetOrder", "Limit": "10" }

В коде PHP вы выполните следующие действия: 1 . аутентифицировать пользователя, если пароль не правильно, реагировать с кодом ошибки и т.д. 2. дешифровать данные 3. Выполнить запрос 4. Возвращает результат в виде зашифрованных данных

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

Если вы не выполнили запросы с параметрами из запроса, вы должны использовать подготовленные инструкции для предотвращения внедрения sql.

Более подробную информацию о ан/дешифрования в PHP посмотреть: http://php.net/manual/de/ref.mcrypt.php

0

Как и некоторые ответы предложенных, я думаю, что вы брандмауэров по Bigrock.

Теперь, если вы хотите использовать AJAX/PHP, вам нужны три вещи: - ваш C# класс для отправки запросов и получить результат - ваш HTML/JS (или JQuery) файл получить запрос и передать его на ваш PHP. Затем отправьте вам результат. - ваш файл PHP для запроса вашей БД.

AJAX кажется излишним для меня, вы можете просто отправить свой запрос, передавая его через POST или параметр GET (т.example.com/query.php?req='SELECT * FROM clients')

кода будет выглядеть следующим образом:

C# с помощью this class сделанной Али Ahsan Раны:

//create the constructor with post type and few data 
MyWebRequest myRequest = new MyWebRequest("http://www.example.com/query.php","POST","req="); 
//use System.Web.Script.Serialization and myRequest.GetResponse(); 

Некоторых tutorial на System.Web.Script.Serialization.

На стороне PHP:

<?php 

    $request=$_POST['req']; 
    $dsn = 'mysql:dbname=mydb;host=example.com'; 
    $user = 'ajay'; 
    $password = '0000'; 

    try { 
     $dbh = new PDO($dsn, $user, $password); 
    } catch (PDOException $e) { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 

    $response = $dbh->query($request);  

    while ($rep = $response->fetch()) 
    { 
     $response_array[] = $rep; 
    } 

    $response->closeCursor(); 

    $return = json_encode($rep); 
    return($return); 

?> 

Это быстрый проект, но должен работать AFAIK.

Смежные вопросы