使用API​​连接到远程mysql数据库

时间:2012-06-21 07:05:22

标签: c# php mysql

我正在用C#设计一个桌面应用程序,它需要连接到我的在线mysql数据库。我试图在控制面板中提供一个“%”,这意味着从任何IP,但它不起作用。可能是托管服务提供商(bigrock)不允许这样做。

或者,我试图在PHP上编写一些在线代码,它将获得“sql”作为参数,并使用json_encode将输出作为JSON格式返回。

是否有其他方法可以采用更好的方法。

7 个答案:

答案 0 :(得分:2)

尝试连接时会出现什么错误?超时=防火墙;权限被拒绝=权限不对等等。

一种解决方案是使用预编码查询创建代理(让我们调用“存储过程”) - 然后可以说“运行查询5,参数A,B和C”。因为这将是服务器 - 服务器(不是公共的),您只需要添加一些基本的身份验证系统(例如共享旋转密钥,使用参数的校验和等),但是如果抛出任何参数,也确保查询不危险。

免责声明:这是一个解决方案,但我实际上并没有建议我这样做,除非你非常确定它是安全的!

答案 1 :(得分:1)

你有Cpanel吗?如果是,请尝试在远程MySQL中添加主机。 如果您不确定如何执行此操作,请在此处链接http://www.liquidweb.com/kb/enable-remote-mysql-connections-in-cpanel/

答案 2 :(得分:1)

我建议您不要创建一个可以在应用程序中使用嵌入式MySQL凭据从任何地方连接到数据库的通配符用户。 这是个坏主意

确定应用程序使用的凭据非常容易,然后恶意用户可以直接连接到您的数据库服务器并开始向您的数据库发出查询。

他们将能够为您表格中的任何信息发布SELECT语句,甚至是他们看不到的信息。然后,更容易利用MySQL中的任何已知或未知漏洞变得更加容易,因为现在它们具有控制台访问权限并且可以直接将数据发送到服务器。如果该帐户具有DELETE权限,则可以删除表格中的所有数据。

此外,使用PHP脚本发出应用程序/最终用户提供的查询并不理想,因为人们仍然可以自由地发出查询。虽然该选项比给予远程用户全面访问更好,但这仍然是一个坏主意。

要做的就是识别C#应用程序需要访问的所有信息,以及如何编写一个简单的Web服务/ API,它将接收参数并发出自己的查询并使用XML返回结果, JSON,甚至是SOAP。尝试尽可能地从外部世界抽象出数据库访问,以获得最佳安全性。

希望有所帮助。

答案 3 :(得分: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地址就足够了。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

您应该通过用户名和哈希密码对客户端进行身份验证。您要发送的数据应加密(例如,用户使用明文密码)。不要发送完整的查询,只发送您想要做的和参数。例如,您想要客户的订单,您可以发送带有以下参数的发布请求 用户= ABC,密码= 9151440965cf9c5e07f81eee6241c042a7b78e9bb2dd4f928a8f6da5e369cdffdd2b70c70663ee30d02115731d35f1ece5aad9b362aaa9850efa99e3d197212a,数据=的EncryptedData

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

数据可以是json或其他任何东西: { “命令”:“GetOrder”, “限制”:“10” }

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

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

如果您不想使用请求中的参数执行查询,则应使用预准备语句来阻止sql注入。

有关在en中进行en / decrypting的更多信息,请参阅:http://php.net/manual/de/ref.mcrypt.php

答案 6 :(得分:0)

像建议的一些答案一样,我认为你被bigrock防火墙。

现在,如果你想使用AJAX / PHP,你需要三件事: - 您的C#类发送请求并接收结果 - 您的HTML / JS(或jQuery)文件,以接收请求并将其交给您的PHP。然后发给你结果。 - 用于查询数据库的PHP文件。

AJAX对我来说似乎是多余的,您可以通过POST或GET参数发送您的查询(即example.com/query.php?req='SELECT * FROM clients'

代码如下:

#A>使用Ali Ahsan Rana制作的this class的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上的一些tutorial

在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。