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

使PHP文件只能通过我的C#应用程序访问?,c#,php,sql,security,authentication,C#,Php,Sql,Security,Authentication,我想问你们几个问题!目前,我的C#应用程序上有一个登录表单,您需要输入正确的用户并通过才能打开另一个表单,即真正的程序。为此,我得到了以下代码行: string response = SendRequest("http://mysite/login.php?name=" + userName); string[] back = response.Split('_'); back[0] = back[0].Replace("

我想问你们几个问题!目前,我的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";
这工作很好,我可以登录时,我输入正确的密码,我不能当我输入错误的密码

但我的问题是,如果我进入:
其中,[username]是任何用户名,它返回经过哈希和盐渍处理的密码。由于它是散列和盐析的,这不是一个大问题,但稍后当我执行插入时,这将成为一个更大的问题,因为有人可以使用此方法将信息输入到表中。因此,我的问题是:如果连接来自我的C#应用程序,PHP文件是否只允许返回值?

如果您真的希望以这样的方式进行管理,您应该执行以下操作之一:

实现OAUTH配置

您应该在PHP应用程序中实现一种形式的OAUTH,并为您的C#应用程序生成正确的令牌。然后,您将使用完整的OAUTH对话框从PHP服务器发送/检索数据。这将消除对页面进行随机查询以返回正确结果的可能性。您还应该使用此工具实现HTTPS。PHPOAUTH实现基础:

优点:安全性。与其他方法相比,这种方法提供了更大的安全性,而总体上不会牺牲项目的健壮性。您还可以通过为每个客户端使用令牌来删除整个GET/POST请求,而不是针对用户名的GET可扩展性。此方法可以很容易地扩展,为进一步的应用程序/程序提供功能

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

将请求修改为带有机密的帖子

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

优点:简单性。此方法最快/最容易实现,无需删除任何当前功能

缺点:不安全。除了通过模糊性提供安全性外,此方法不提供任何安全性好处

改变数据库可见性

由于您在PHP页面上使用MySQL返回值,因此应该修改C#程序,直接连接到MySQL数据库并收集值。这样做的好处是消除了恶意用户在未经您允许的情况下查询PHP页面的可能性。各种MySQL连接器:

优点:安全性适中。这种方法确实消除了PHP攻击的可能性,并且有助于保持数据库的机密性

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

自定义用户代理

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

您可以使用自定义的用户代理(类似于POST方法中的secret),这将允许您的PHP页面确定请求可能来自您的应用程序。同样,对于这种方法,您也应该使用HTTPS。此方法不需要太多代码更改,并且可以与HTTP\u REFERER结合使用,以帮助保护源代码

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

缺点:不安全。很像使用Secret
方法发布的帖子,这是非常不安全的。任何人只要知道你的用户代理是如何形成的,就可以非常简单而容易地利用它。使用HTTPS可能有助于降低这种风险,但这种风险永远不会消失

示例:

C#::
client.Headers.Add(“用户代理”,“我的超级不安全用户代理”)

PHP:
if($\u服务器['HTTP\u用户\u代理]==“我的超级不安全用户代理”){/*处理请求*/}

Tl;dr

最终,选择权在你。鉴于这种情况,我建议采用以下建议:

  • 如果开发时间不是问题,则使用OAUTH模型。这是最具扩展性和安全性的方法
  • 如果通常可以消除PHP,请使用数据库可见性模型。这样做的好处是消除了与公开可见PHP页面相关的继承安全风险。如果数据库始终位于用户网络的本地,您还可以使用此模型,从而提高效率和速度。这也意味着,如果设置了适当的防火墙,外部人员无法访问您的信息
  • 如果您需要快速而肮脏的解决方案,请使用帖子