使用API连接远程MySQL数据库

3
我正在使用C#设计一个桌面应用程序,需要连接到我的在线MySQL数据库。我尝试在控制面板中给予 "%" 访问权限,表示允许来自任何IP的访问,但它并没有起作用。可能是托管提供商(bigrock)不允许这样做。
另外,我正在尝试在PHP在线编写一些代码,该代码将获取 "sql" 作为参数,并使用json_encode以JSON格式返回输出。
是否有更好的方法可以实现此功能?

2
将凭据嵌入应用程序是一个不好的想法。为什么不编写一个服务器或与Web服务器接口以进行任何查询?最重要的是,为什么需要让您的应用程序连接到数据库? - John V.
1
数据库必须可以从外部访问,这在默认情况下几乎从不是真的。 - Elzo Valugi
我同意@Elzo Valugi的观点,我曾经遇到过同样的问题,通过联系我的服务提供商解决了这个问题。 - HichemSeeSharp
在使用相同的代码并获取专用IP后,它可以正常工作。 - AjayR
7个回答

2

当你尝试连接时,你会收到什么错误? 超时 = 防火墙阻止;权限被拒绝 = 权限不正确等。

一种解决方案是创建一个带有预编码查询的代理(我们称之为“存储过程”)-然后您可以说“运行查询5,参数A,B和C”。由于这将是服务器对服务器(而非公共)的传输,因此您只需要添加一些基本的身份验证系统(例如共享的轮换密钥,使用参数的校验和等),但也要确保查询不会因为任何参数的注入而变得危险。

免责声明:这是一种解决方案,但我实际上并不推荐除非你非常确定它是安全的!


1
如果您的凭据错误且服务器未被防火墙隔离,则会出现这种情况。这表明您应该具有远程连接权限-请与您的主机确认。 - Robbie

1

1
我建议您不要创建一个通配符用户,使用嵌入式MySQL凭据在应用程序中从任何地方连接到数据库。这是个坏主意。
很容易确定应用程序使用的凭据,然后恶意用户可以直接连接到您的DB服务器并开始向您的数据库发出查询。
他们将能够为表中的任何信息发出SELECT语句,甚至是他们不应该看到的信息。这样一来,利用MySQL已知或未知的漏洞就变得更加容易,因为现在他们有了控制台访问权限,并且可以直接向服务器发送数据。如果该帐户具有DELETE权限,则可以删除表中的所有数据。
此外,拥有一个由应用程序/最终用户提供查询的PHP脚本并不理想,因为仍然可以自由地发出查询。虽然这个选项比给远程用户提供全面访问权限要好,但它仍然是个坏主意。
正确的方法是识别C#应用程序需要访问的所有信息以及如何访问,并编写一个简单的Web服务/API,它将接收参数并发出自己的查询并使用XML、JSON或甚至SOAP返回结果。尽可能地将数据库访问与外部世界隔离,以获得最佳安全性。
希望这有所帮助。

0

我不确定您是否具有根访问权限或访问my.cfg的权限。如果您可以编辑它,请确保注释或删除“skip-networking”行,并包含“bind-address = *”行。在编辑配置后重新启动mysql。


正如drew010所提到的,允许用户从任何地方连接并不是一个好主意。但是在MySQL配置中,您无法指定多个“bind-address”(实际上可以,但是最后指定的将被优先选择)。因此,我会保留“bind-address = *”,但设置用户权限,只允许从指定的IP连接。 - Tim

0

出于安全考虑,您不应该通过(公共)网络直接访问数据库。

一种方法是在数据库服务器上编写一个 PHP 脚本,然后通过 HTTP/POST 访问它。

您应该通过用户名和哈希密码对客户端进行身份验证。您发送的数据应该是加密的(例如使用用户明文密码)。不要发送完整的查询语句,只需发送想要执行的操作和参数即可。例如,您想要为客户获取订单,可以发送具有以下参数的 POST 请求:user=abc,password=9151440965cf9c5e07f81eee6241c042a7b78e9bb2dd4f928a8f6da5e369cdffdd2b70c70663ee30d02115731d35f1ece5aad9b362aaa9850efa99e3d197212a,data=EncryptedData

您可以注意到,密码是 SHA512 哈希。

数据可以是 JSON 或其他任何格式: { "Command": "GetOrder", "Limit": "10" }

在您的 PHP 代码中,您需要执行以下步骤: 1. 验证用户,如果密码不正确,则响应错误代码等 2. 解密数据 3. 执行查询 4. 返回加密数据结果

如果您不想在数据库中存储明文密码,可以将哈希值存储在数据库中,并使用双重哈希值进行身份验证和单个哈希值进行加密。

如果您想要执行来自请求的带参数查询,应该使用准备好的语句来防止 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#使用Ali Ahsan Rana制作的这个类

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

?>

那只是个快速草稿,但据我所知应该能够运行。


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地址足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接