2

我有一个包含身份验证系统(登录名和密码)的应用程序(用 Delphi 制作)。

这个系统是用 PHP 编写的,应用程序使用 HTTP GET方法从 PHP 获取结果。如果登录名和密码正确,系统返回“OK”,如果不正确,系统返回“NO”。

像这样...

procedure Check;
var
 x: string;
begin
 x:=Get('www.mywebsite.com/auth.php?user=xxxxxx&pass=zzzzzz');
 if x='OK' then 
  UnlockFeatures
 else
  MessageBox(0,'You're not VIP','Error',0);
end;

嗯,它工作得很好,但是用嗅探器、数据包编辑器或代理很容易绕过这个系统。

所以,我想获得一些每次都会改变的信息(在 PHP 中),并且我的应用程序可能会获得相同的信息。

我能做些什么?

我不需要代码。只是提示,建议,请...

谢谢...

4

2 回答 2

2

一般来说,我建议你不要试图比每个人都聪明并发明全新的自行车——你会因为一些愚蠢的错误而失败 99%,使你的方法完全不安全。有很多优先级,例如 DVD 加密或 Win95 安全性。您最好尝试一些行业认可的机制,这些机制多年来都经过了安全性测试,应该已经为 Delphi 和 PHP 提供了现成的实现。很少有

  • TLS(https:// 协议)http://en.wikipedia.org/wiki/Transport_Layer_Security - 这不会提供对MITM攻击的保护,但这听起来正是您所要求的,并且需要最少的更改。
  • 如果您的服务器支持,您可以尝试通过集成的 Windows 身份验证实现SSO
  • 您可以尝试设置OpenIDOAuth环境。通常他们的 v.1 会比 v.2 更简单
  • 您可以尝试摆脱 HTTP 并使用XMPP/Jabber身份验证 - 他们非常重视安全性,并且存在 PHP 和 Delphi 库。虽然它不应该比仅使用 TLS 更安全,但您可能希望愚蠢的攻击者不会为非 HTTP 协议做好准备(Facebook 之外没有互联网等)。
  • 您可以使用类似蓝牙的方法进行一次特殊连接(“握手”)(当客户端和服务器都受到控制时),只是为了交换和存储特殊的“令牌”。这是使用“受控环境”进行第一次连接并使用一些标记来证明“我们以前见过”在使用通用挑战/响应特征的后续连接中的通用特征。对于每个客户端-用户-服务器组合,这些令牌应该是唯一的!如果您要创建一个服务器全局客户端共享的一组令牌 - 它们只会很容易地从一个客户端复制到另一个客户端,并且没有更多的安全性。
    • 这些可能是一些不重要的RNG的系数。构造为服务器并由客户端和服务器保存。然后服务器用 RNG 种子“挑战”,客户端应该用适当的随机值响应,证明他知道系数。
    • 这些可能是一些非对称加密,其中令牌是一些随机“消息”,然后服务器发送客户端加密密钥并期望由它们加密的正确消息,或者令牌是密码并且服务器生成随机文本并期望它是正确的加密数字签名被传回去。您可以在Torry.net上找到加密库作为示例。Lockbox3和 Spring4Delphi 是 Delphi 实现某些加密标准的经过测试和关注最多的加密库之一。

考虑您的优先事项并做出选择。您是否能够在稍后一键切换所有身份验证层,完全不关心与未更新客户端的向后兼容性,那么您可能会选择最简单的一个,然后在需要时才对其进行增强。如果您的用户懒于升级,那么您最好从初学者中选择最安全的方法,因为以后您将没有实用的方法来禁用不安全的实现。

于 2012-09-28T07:07:08.630 回答
2

我不熟悉 Delphi(很久以前......),但就 php 和安全性而言:

  • 我会使用post而不是gethttps如果可能的话)
  • 如果您可以使用 Delphi 读取 php 会话,则可以添加一个带有随机数的会话变量并将其添加为隐藏表单字段,将其发送并对照会话变量进行检查。
于 2012-09-27T17:15:34.170 回答