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

Make a PHP file accesable only via my C# application?

我有一些小问题要问大家!目前我的 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] [用户名] 是任何用户名,return 是散列和加盐密码。因为它被散列和加盐,所以这不是一个大问题,但稍后当我插入时,这将成为一个更大的问题,因为那时有人可以使用这种方法将信息输入到表中。所以我的问题是:如果连接来自我的 C# 应用程序,是否可以使 PHP 文件只允许 return 值?

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

实施 OAUTH 配置

您应该在您的 PHP 应用程序中实施一种 OAUTH 形式,并为您的 C# 应用程序生成正确的适当令牌。然后,您将使用完整的 OAUTH 对话来 send/retrieve 来自 PHP 服务器的数据。这将消除随机查询页面以获得 return 正确结果的可能性。您还应该使用此实现 HTTPS。 PHP OAUTH 实现基础:http://www.sitepoint.com/creating-a-php-oauth-server/

优点:安全。这种方法提供了比其他方法更大的安全性,而不会 总体上牺牲项目的稳健性。您还可以通过为每个客户端使用令牌而不是 GET 对用户名。 可扩展性。可以轻松扩展此方法以提供进一步 apps/programmes.

的功能

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

修改 Request 为 POST with Secret

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

优点:简单。此方法是 quickest/easiest 在不删除任何当前功能的情况下实现的。

缺点:不安全。此方法不提供任何安全优势,除了 通过隐蔽性实现安全性

改变数据库可见性

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

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

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

自定义用户代理

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

您可以使用自定义 User Agent(类似于 POSTsecret 方法。)这将允许您的 PHP 页面确定请求 可能 来自您的应用程序。同样,您也应该为此方法使用 HTTPS。此方法不需要太多代码更改,并且可以与 HTTP_REFERER 结合使用,以帮助保护来源。

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

缺点:不安全。很像 POST with Secret 方法,这是 非常 不安全的。任何知道您的 User Agent 是如何形成的人都可以非常简单和容易地利用它。使用 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

Tl;dr

最终,选择权在您手中。鉴于这种情况,我建议使用以下建议:

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