3

私はC#でデスクトップアプリケーションを設計しています。これはオンラインのmysqlデータベースに接続する必要があります。コントロールパネルのアクセスに「%」を付けようとしましたが、これは任意のIPからのアクセスを意味しますが、機能していません。それを許可していないホスティングプロバイダー(bigrock)である可能性があります。

または、PHPでオンラインでコードを記述しようとしています。このコードは、パラメーターとして「sql」を取得し、json_encodeを使用して出力をJSON形式で返します。

より良いアプローチである代替方法はありますか?

4

7 に答える 7

2

接続しようとするとどのようなエラーが発生しますか?タイムアウト=ファイアウォール; 許可が拒否されました=許可が正しくありませんなど。

1つの解決策は、事前にコード化されたクエリを使用してプロキシを作成することです(次に、「ストアドプロシージャ」を呼び出します)。次に、「クエリ5、パラメータA、B、およびCを実行する」と言うことができます。これはサーバー-サーバー(公開されていない)であるため、基本認証システム(共有ローテーションキー、パラメーターを使用したチェックサムなど)を追加する必要がありますが、パラメーターがスローされてもクエリが危険でないことを確認してください。

免責事項:これは解決策ですが、安全であることが確実でない限り、実際に実行することはお勧めしません。

于 2012-06-21T09:13:36.103 に答える
1

Cpanelはありますか?はいの場合は、リモートMySQLにホストを追加してみてください。方法がわからない場合は、リンクhttp://www.liquidweb.com/kb/enable-remote-mysql-connections-in-cpanel/を参照してください。

于 2012-08-10T05:59:39.373 に答える
1

アプリケーションに埋め込まれたMySQLクレデンシャルを使用して、どこからでもデータベースに接続できるワイルドカードユーザーを作成しないことをお勧めします。 これは悪い考えです。

アプリケーションで使用されている資格情報を特定するのは非常に簡単で、悪意のあるユーザーがDBサーバーに直接接続して、データベースへのクエリの発行を開始する可能性があります。

SELECT彼らはあなたのテーブルのどんな情報に対してもステートメントを発行することができます、彼らが見るべきではない情報さえも。その後、MySQLの既知または未知の脆弱性を悪用することがはるかに簡単になります。これは、MySQLがコンソールにアクセスでき、サーバーに直接データを送信できるようになったためです。アカウントにDELETE権限がある場合、テーブル内のすべてのデータを消去できます。

また、アプリケーション/エンドユーザーによって提供されたクエリを発行するPHPスクリプトを使用することは、クエリを自由に発行できるため理想的ではありません。このオプションは、リモートユーザーに包括的アクセスを許可するよりも優れていますが、それでも悪い考えです。

進むべき道は、C#アプリケーションがアクセスする必要のあるすべての情報とその方法を特定し、パラメーターを受け取り、独自のクエリを発行し、XML、JSON、またはを使用して結果を返す単純なWebサービス/APIを作成することです。 SOAPですら。最高のセキュリティを確保するために、外部からのデータベースアクセスを可能な限り抽象化するようにしてください。

お役に立てば幸いです。

于 2012-08-12T19:04:45.350 に答える
0

ルートアクセス権があるのか​​、my.cfgへのアクセス権があるのか​​わかりません。編集できる場合は、「skip-networking」の行がコメント化または削除され、「bind-address=*」の行が含まれていることを確認してください。設定を編集した後、mysqlを再起動します。

于 2012-08-12T18:44:54.847 に答える
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ます。

2つ目はうまくいきましたが、過去に取り組んだプロジェクトで、IPアドレスで十分だと思われる理由がわかりません。

于 2012-08-06T17:54:15.167 に答える
0

セキュリティ上の理由から、(パブリック)ネットワークを介してデータベースに直接アクセスしないでください。

1つの方法は、データベースサーバーにphpスクリプトを記述し、HTTP/POSTを介してそれにアクセスすることです。

ユーザー名とハッシュ化されたパスワードを使用してクライアントを認証する必要があります。送信するデータは暗号化する必要があります(たとえば、ユーザーのクリアテキストパスワードを使用)。完全なクエリを送信するのではなく、実行したいこととパラメータのみを送信してください。例として、顧客の注文が必要な場合は、次のパラメーターを使用してPOSTリクエストを送信できます。user= abc、password = 9151440965cf9c5e07f81eee6241c042a7b78e9bb2dd4f928a8f6da5e369cdffdd2b70c70663ee30d02115731d35f1ece5aad9b362aaa

パスワードがSHA512ハッシュであることがわかります。

データはjsonまたはその他のものにすることができます:{"Command": "GetOrder"、 "Limit": "10"}

PHPコードで、次の手順を実行します。1.ユーザーを認証し、パスワードが正しくない場合は、エラーコードなどで応答します。2。データを復号化します。3。クエリを実行します。4。結果を暗号化されたデータとして返します。

クリアテキストのパスワードをデータベースに保存したくない場合は、ハッシュ値をデータベースに保存し、認証にダブルハッシュ値を使用し、暗号化にシングルハッシュ値を使用できます。

リクエストのパラメータを使用してクエリを実行したくない場合は、SQLインジェクションを防ぐためにプリペアドステートメントを使用する必要があります。

phpでのen/decryptingの詳細については、http://php.net/manual/de/ref.mcrypt.phpを参照してください。

于 2012-08-12T20:08:35.260 に答える
0

いくつかの回答が示唆しているように、あなたはビッグロックによってファイアウォールで保護されていると思います。

ここで、AJAX / PHPを使用する場合は、次の3つが必要です。-リクエストを送信して結果を受信するC#クラス-リクエストを受信して​​PHPに渡すHTML / JS(またはjQuery)ファイル。次に、結果を送信します。-DBをクエリするためのPHPファイル。

AJAXは私には不必要に思えます。クエリを送信して、POSTまたはGETパラメーター(つまりexample.com/query.php?req='SELECT * FROM clients')を介して渡すことができます。

コードは次のようになります。

Ali Ahsan Ranaによって作成されたこのクラスを使用したC# :

//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();

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で機能するはずです。

于 2012-08-12T20:30:49.113 に答える