【问题标题】:How secure is file_get_contents with GET parameters over https://通过 https:// 使用 GET 参数的 file_get_contents 的安全性如何
【发布时间】:2013-01-23 18:38:00
【问题描述】:

我通过以下方式使用“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 的情况下有多安全?

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

【问题讨论】:

  • TCP 和 HTTP 之间的整个连接应该被加密,是否可以使用 cURL 来代替执行 POST 请求?
  • 是的,cURL 是可用的……但是我不知道怎么用,哈哈。
  • 这里有一个类似的问题线程stackoverflow.com/questions/893959/… 我会避免这种情况,以确保不会生成可能包含查询字符串参数的服务器日志

标签: php security file-get-contents


【解决方案1】:

[更新] 在几次 cmet 之后,我意识到我阅读和回答你的问题太快了。我已经改变主意了。

回答您的确切问题

HTTPS 与您的私钥一样安全

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

POST 优于 GET

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

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

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

您可以像这样使用cURL 进行POST:PHP + curl, HTTP POST sample code?

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

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

使用共享公钥

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

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

在此处阅读有关最后一个的更多信息:Output of openssl_public_encrypt() and 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 组件之类的东西或类似的东西。

【讨论】:

  • Err.. 只有在 Wireshark 运行在进行连接的计算机上(通过窃取会话密钥),或者如果您拥有 HTTPS 网站的私钥时,才可以使用 Wireshark 解密内容.如果有人可以通过监听来解密 HTTPS 流量,那将完全破坏 HTTPS 的意义。
  • @SecurityMatt,你显然是对的,不知道我在想什么。现在编辑答案。
  • “检查”操作对我来说似乎是幂等的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多