1

我通过以下方式使用“file_get_contents”:

(下面的脚本发布在,例如https://siteA.com/checkifvalid.php ...注意 URL 是 httpS)

<?php
//there is a login form on this URL and the entries put in the form are used to set the username & password variables below.
$username = "someusername";
$password = "somepassword";
$secretkey = "slkd89087235";

$yesorno = file_get_contents("httpS://siteB.com/checkdatabase.php?username=$username&password=$password&secretkey=$secretkey");

if ($yesorno == 'yes') {
//details are valid, so something 
} else {
//details aren't valid, display they aren't valid
}
?>

“checkdatabase.php”脚本使用 _GET 获取用户名和密码,并从 URL 中获取变量,然后交叉引用这些登录详细信息以查看它们是否有效。如果是,则回显“是”,如果不是,则回显“否”。

checkdatabase.php 脚本设置为仅在用户名、密码和密钥参数都已传递的情况下运行,并且仅当已传递的密钥值与存储在该 php 脚本中的密钥匹配时才运行。

在给定的时间范围内,“ http://siteA.com/checkifvalid.php ”的输入次数也将受到限制,以防止一种“暴力”攻击猜测用户/密码组合。

我的问题是,当两个 URL 都使用 httpS 时,上述方法的安全性如何?

我应该加密发送的值吗?或者上面的东西已经安全了吗?

4

1 回答 1

3

[更新] 在发表了几条评论后,我意识到我阅读并回答您的问题太快了。我改变主意了。

回答您的确切问题

HTTPS 与您的私钥一样安全

除非您的攻击者有权访问私有 SSL 密钥,否则 HTTPS 是安全的。如果您的服务器曾经受到威胁,那么 HTTPS 也会受到威胁,直到您生成新密钥。

比起 GET 更喜欢 POST

其次,如果你真的要为此使用 HTTP,你应该使用 POST 而不是 GET。

1)语义原因:您要求其他服务器做某事。该操作不是幂等的,但 GET 方法是(至少在理论上)。正如@Gumbo 在评论中指出的那样,您只是在进行检查,而不是在目标服务器上运行任何操作,因此关于幂等性的评论在这里不适用。

2) 您的密码可能会显示在访问日志中。尽管默认情况下不同的堆栈似乎以不同的方式处理 HTTPS 登录,但您不应该冒险并假设 GET 请求最终会出现在某个日志文件中。

您可以像这样使用cURL进行 POST:PHP + curl, HTTP POST 示例代码?

不要发布/存储纯文本密码

存储和发布加密密码 您的主数据库不应存储纯文本密码。相反,在保存之前对其进行加密,然后在比较之前对提交的用户输入进行加密。

使用共享公钥

您可以实现共享密钥,而不是发布纯文本用户名/密码/秘密。这与 HTTPS 使用的机制基本相同。使用此方法,您可以安全地通过 HTTP 发送此请求。

阅读public-key cryptography,它真的很容易理解。使用openssl_public_encrypt().

在此处阅读有关最后一个的更多信息:openssl_public_encrypt() 和 openssl_private_encrypt() 的输出

不同的方法

直接查询远程数据库

到目前为止,最简单的方法是在 siteB 上设置 Mysql 守护程序以仅接受来自 siteA 的远程连接,并直接从 siteA 查询 siteB 数据库。这根本不涉及 HTTP。只需确保您的 MySQL 密码是安全的,受 IP 限制,并且不要存储纯文本密码。

编写OAUTH提供者服务

来自维基百科:

[OAUTH] 为最终用户提供了一个流程,可以使用用户代理重定向授权第三方访问其服务器资源,而无需共享其凭据(通常是用户名和密码对)。

这是我发现的第一篇关于编写自己的文章:http: //toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html

如果这是你要走的路,你最好使用 Zend Framework 中的 OAUTH 组件或类似的东西。

于 2013-02-08T03:26:39.893 回答