通过https://使用GET参数的file_get_contents的安全性如何

时间:2013-02-08 03:10:21

标签: php security file-get-contents

我正在以下列方式使用“file_get_contents”:

(下面的脚本发布在,例如https://siteA.com/checkifvalid.php ...注意网址是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”脚本获取用户名&amp;密码使用_GET并从URL中获取变量,然后交叉引用这些登录详细信息以查看它们是否有效。如果是的话,它会回答“是”,如果没有,它会回答“不”。

checkdatabase.php脚本设置为仅在用户名,密码和&amp;已传递密钥参数,然后仅当已传递的密钥值与该php脚本中存储的密钥匹配时才会生效。

在给定的时间范围内可以输入“http://siteA.com/checkifvalid.php”的次数也有限制,以防止某种类型的“强力”攻击猜测用户/通过组合。

我的问题是,上述方法看到两个网址都使用httpS是多么安全?

我应该加密发送的值吗?或者已经是安全的了吗?

1 个答案:

答案 0 :(得分:3)

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

回答您的确切问题

HTTPS与您的私钥一样安全

除非您的攻击者可以访问私有SSL密钥,否则HTTPS是安全的。如果您的服务器遭到入侵,那么在生成新密钥之前,HTTPS也是如此。

首选GET

其次,如果您真的要使用HTTP,则应该使用POST而不是GET。

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

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

您可以使用cURL进行POST,如下所示:PHP + curl, HTTP POST sample code?

不发布/存储纯文本密码

存储并发布加密密码 您的主数据库不应存储纯文本密码。而是在保存之前加密它,然后在比较之前加密提交的用户输入。

使用共享公钥

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

阅读public-key cryptography,这很容易理解。使用openssl_public_encrypt()实现它。

在此处详细了解最后一个:Output of openssl_public_encrypt() and openssl_private_encrypt()

不同的方法

直接查询远程数据库

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

编写OAUTH提供商服务

来自维基百科:

  

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

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

你可能最好在Zend Framework中使用类似OAUTH组件的东西,或者类似的东西,如果那是你走的路。