我正在用 C# 设计一个桌面应用程序,它需要连接到我的在线 mysql 数据库。我试图在控制面板中提供一个“%”,这意味着来自任何 IP,但它不起作用。可能是托管服务提供商(bigrock)不允许这样做。
或者,我正在尝试在 PHP 上在线编写一些代码,它将获取“sql”作为参数,并使用 json_encode 以 JSON 格式返回输出。
有没有更好的替代方法。
尝试连接时遇到什么错误?超时=防火墙;权限被拒绝 = 权限不正确等。
一种解决方案是创建一个带有预编码查询的代理(我们称之为“存储过程”)——然后您可以说“运行查询 5,参数 A、B 和 C”。由于这将是服务器-服务器(非公共),因此您只需要添加一些基本的身份验证系统(例如共享轮换密钥、使用参数的校验和等),但还要确保在向其抛出任何参数时查询不危险。
免责声明:这是一个解决方案,但我实际上并不建议我这样做,除非您非常确定它是安全的!
我建议您不要创建可以使用应用程序中的嵌入式 MySQL 凭据从任何地方连接到数据库的通配符用户。 这是个坏主意。
确定您的应用程序使用的凭据将非常容易,然后恶意用户可以直接连接到您的数据库服务器并开始向您的数据库发出查询。
他们将能够SELECT
针对您的表格中的任何信息发布语句,甚至是他们不应该看到的信息。然后,利用 MySQL 中任何已知或未知的漏洞变得更加容易,因为现在它们具有控制台访问权限并且可以直接将数据发送到服务器。如果该帐户具有DELETE
权限,他们可以删除您表中的所有数据。
此外,拥有一个发出由应用程序/最终用户提供的查询的 PHP 脚本并不理想,因为仍然可以自由地发出查询。尽管该选项比向远程用户提供全面访问要好,但这仍然是一个坏主意。
可行的方法是识别 C# 应用程序需要访问的所有信息,以及如何访问,并编写一个简单的 Web 服务/API,该服务/API 将接收参数并发出自己的查询并使用 XML、JSON 或甚至肥皂。尝试尽可能从外部世界抽象数据库访问,以获得最佳安全性。
希望有帮助。
你有Cpanel吗?如果是,请尝试在远程 MySQL 中添加您的主机。如果您不确定如何操作,请点击此处链接http://www.liquidweb.com/kb/enable-remote-mysql-connections-in-cpanel/ 。
我不确定您是否具有 root 访问权限或对 my.cfg 的访问权限。如果您可以编辑它,请确保注释或删除“skip-networking”行并且它包含“bind-address = *”行。修改配置后重启mysql。
我会做以下事情:
使用您的公共 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 地址就足够了。
出于安全原因,您不应直接通过(公共)网络访问数据库。
一种方法是在数据库服务器上编写一个 php 脚本并通过 HTTP/POST 访问它。
您应该通过用户名和散列密码对客户端进行身份验证。您发送的数据应该加密(例如使用用户明文密码)。不要发送完整的查询,只发送你想要做的和参数。As example, you want the orders for the customer, you can send a post request with the following parameters 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
就像一些建议的答案一样,我认为你被 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);
?>
这是一个快速草稿,但应该适用于 AFAIK。