【问题标题】:function.file-get-contents - failed to open stream [duplicate]function.file-get-contents - 无法打开流[重复]
【发布时间】:2012-01-30 09:30:20
【问题描述】:

可能重复:
file_get_contents with query string

我正在使用file_get_contents 函数,但虽然返回正确的输出,但它仍然显示此错误:

Warning: file_get_contents(secure/validate.php?cardnumber=1234567) [function.file-get-contents]: failed to open stream: No error in ...

场景是卡号验证,validatecard.php 中有一个简单的 if 语句:

if (isset($_GET['cardnumber']) && ($_GET['cardnumber'] == "12345")) {
    echo "OK";
} else {
    echo "INVALID CARD";
}

我的代码是:

$cardnumber = $_POST["cardnumber"];
$url = "secure/validate.php?cardnumber=" . $cardnumber;
if (file_get_contents($url) != "OK"){
    $order_error_msg = "Invalid card number";
} else { ....

可能是什么问题?

【问题讨论】:

  • 路径正确吗? $_POST['cardnumber'] 已设置? allow_url_fopen = 在 phpinfo() 中打开?
  • 您正在尝试打开一个本地路径,如 URL。

标签: php file-get-contents


【解决方案1】:

好吧,看来您的 php.ini 中没有设置 allow_url_fopen @Gordon 是正确的,这不是 url_fopen 问题。它实际上是失败的,因为在本地文件上使用 file_get_contents 实际上会得到文件的 code,而不是运行该文件的 PHP 处理结果。要让它按您的意愿工作,您需要通过在 url 前添加“https://localhost/”并启用 allow_url_fopen 来访问 apache/PHP。

但这看起来也是一段非常令人担忧的代码;您应该尽可能少地在代码中使用 CC 编号。通过在 get 字符串上使用 file_get_contents 和卡号,它打开了将号码记录在某处的可能性。

一个更安全的实现看起来像这样:

验证卡.php

function checkCard($card) {
  if ($card == "12345")) {
      return "OK";
  } else {
      return "INVALID CARD";
  }
}

然后在你的主代码中:

include('secure/validatecard.php');

$cardnumber = $_POST["cardnumber"];
if (checkCard($cardnumber) != "OK"){
    $order_error_msg = "Invalid card number";
} else { ....

这样,您的 checkCard 功能就更加可重复使用,而且您不必过多地摆弄卡号。

如果您决定使用 file_get_contents 方法并点击https://localhost/secure/validatecard.php?card=12345,那么信用卡号以纯文本形式记录在您的 apache 访问日志中。这几乎是刑事疏忽,不要这样做。

另外,根据 Gordon 的建议,请确保您一直使用 https。

您可以考虑聘请具有编写购物车/结账经验的承包商。这些事情对于正确处理很重要,如果您没有经验,可能会以微妙的方式不安全。

【讨论】:

  • @Gordon 我没有添加 POST 要求,它只是从 OP 的代码中复制而来。我添加了使用 include 来检查卡号,而不是在 get 参数中使用该卡访问另一个脚本。
  • 现在好多了。感谢您进行更改。我恢复了反对票。您可能想强调 OP 应该使用 HTTPS,并指出有法律规定如何处理网络上的 CC 交易。
【解决方案2】:

您确定您的php.ini 配置允许打开网址吗?

您可以使用phpinfo() 并搜索allow_url_fopen 进行检查

另外,作为另一张海报 noted ,使用 GET 处理这类事情并不是很理想(阅读:真的很糟糕)。如果您热衷于向另一个页面发出请求,而不是使用文件(例如,如果该其他页面不在您的服务器上),请尝试使用 cURL 并发出 POST 请求

【讨论】:

  • allow_url_fopen 与此无关
  • 好吧,文档另有说明:uk3.php.net/manual/en/function.file-get-contents.php(查看注释)
  • 但 OP 没有传入 URL。他正在通过本地路径。
  • 是的,他没有传递 URL,这可能是一个错误,也可能是他的预期用途。在 OP 清除之前,两者都是可能的
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2011-04-03
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多