我为你们提出了一些问题!目前我的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#应用程序?
答案 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 强>
最终,选择权归你所有。鉴于这种情况,我建议使用以下建议: