只能通过我的C#应用​​程序访问PHP文件?

时间:2015-04-20 13:46:03

标签: c# php sql security authentication

我为你们提出了一些问题!目前我的C#应用​​程序上有一个登录表单,您需要输入正确的用户并传递打开另一个真正的程序表单。要做到这一点,我得到了这行代码:

            string response = SendRequest("http://mysite/login.php?name=" + userName);
            string[] back = response.Split('_');
            back[0] = back[0].Replace(" ", "");
            back[0] = back[0].ToUpper();

我得到了这个方法:

    private string SendRequest(string url)
    {
        try
        {
            using (WebClient client = new WebClient())
            {
                return client.DownloadString(new Uri(url));
            }
        }
        catch
        {
            MessageBox.Show("Error while receiving data from the server.","Something broke.. :(", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            return null;
        }
    }

我还有一种方法可以检查输入的密码是否是数据库中存储的密码

$dbConnection = new mysqli("SERVER", "LOGIN", "PASS", "DBNAME");
$email = $_GET['name'];
$stmt = $dbConnection->prepare('SELECT password, salt FROM TABLE WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->bind_result($pass, $salt);
$stmt->fetch();
echo "$pass" . "_" .  "$salt";

这很好用,当我输入正确的密码时我可以登录,而当我输入错误的密码时我无法登录。

我的问题是,如果我输入:http://mysite/login.php?name=[username] 其中 [用户名] 是任何用户名,它返回哈希和盐渍密码。由于它是散列和腌制的,这不是一个大问题,但后来当我进行插入时,这将成为一个更大的问题,因为那时有人可以用这种方法将信息输入到表中。所以我的问题是:有没有让PHP文件只允许返回值,如果连接来自我的C#应用​​程序?

1 个答案:

答案 0 :(得分:1)

如果您真的有兴趣以这样的方式管理它,您应该执行以下操作之一:

实施OAUTH配置

您应该在PHP应用中实施 OAUTH 形式,并为您的C#应用​​生成正确的令牌。然后,您将使用完整的 OAUTH 对话框从PHP服务器发送/检索数据。这将消除对页面的随机查询返回正确结果的可能性。您还应该使用此实现 HTTPS 。 PHP OAUTH 实施基础知识:http://www.sitepoint.com/creating-a-php-oauth-server/

优点:安全性。这种方法提供了比其他方法更高的安全性,没有一般地牺牲了项目的稳健性。您还可以通过为每个客户端使用令牌而不是针对用户名的 GET 来删除整个 GET / POST 请求。的扩展即可。可以轻松扩展此方法,以便为其他应用程序/程序提供功能。

缺点:复杂性。这种方法比其他方法复杂得多,开销也大得多。

将请求修改为具有密钥的POST

另一个选择是更改C#程序以向PHP页面发送 POST 请求,并同时发送一些秘密值。不推荐这样做,因为任何知道秘密值的人都可以从恶意页面发送它。这相当于实施基本的 XSS 攻击防范。您也应该使用 HTTPS

优点:简洁。在不删除任何当前功能的情况下,此方法是最快/最容易实现的。

缺点:不安全。除了通过默默无闻的安全性之外,此方法不提供任何安全性好处。

更改数据库可见性

由于您在PHP页面上使用 MySQL 来返回值,因此您应该修改C#程序以直接连接到 MySQL 数据库并收集值。这样做的好处是可以避免恶意的人在未经您许可的情况下查询PHP页面的可能性。各种MySQL连接器:https://www.mysql.com/products/connector/

优点:中等安全性。此方法确实消除了PHP利用的可能性,并且还有助于保持数据库的安全。

缺点:中度不安全。此方法需要在分发时将连接字符串(使用用户名和密码)嵌入到应用程序中。可以采取某些措施来帮助消除这方面的一些问题,但一般来说这种方法是一种平均方法。 代码重写。此方法需要完全重写编程基础结构。

自定义用户代理

编辑:忘记提及另一个非常不安全的简单/简单的解决方法。

您可以使用自定义用户代理(类似于 POST 方法中的密码。)这将允许您的PHP页面确定请求可能来自您的应用程序。您应该再次使用 HTTPS 作为此方法。此方法不需要太多代码更改,并且可以与 HTTP_REFERER 结合使用,以帮助保护原点。

优点:简洁。到目前为止,这是最容易实现的方法。

缺点:不安全。很像 POST with Secret 方法,这是不安全。任何知道用户代理如何形成的人都可以非常简单地利用它。使用 HTTPS 可能有助于降低此风险,但它永远不会消失。

实施例

C#:client.Headers.Add ("user-agent", "my-super-insecure-user-agent"); https://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

PHP:if ($_SERVER['HTTP_USER_AGENT'] === "my-super-insecure-user-agent") {/*Process request*/} http://php.net/manual/en/reserved.variables.server.php

<强>铊组成; dr

最终,选择权归你所有。鉴于这种情况,我建议使用以下建议:

  1. 如果开发时间不是问题,请使用 OAUTH 模型。这是最具扩展性和安全性的方法。
  2. 如果您可以删除PHP,请使用数据库可见性模型。这样做的好处是可以消除与公开可见的PHP页面相关的继承安全风险。如果数据库始终是用户网络的本地数据库,您还可以以更高的效率和速度使用此模型。这也意味着如果适当的防火墙,外人无法访问您的信息。
  3. 如果您需要快速而肮脏的解决方案,请使用 POST 模型。这将是最快和最简单的实施,但 最不安全