function.file-get-contents - 无法打开流

时间:2012-01-30 09:30:21

标签: php file-get-contents

  

可能重复:
  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 { ....

可能是什么问题?

2 个答案:

答案 0 :(得分:3)

好吧,好像你没有在你的php.ini中设置allow_url_fopen @Gordon是正确的,这不是url_fopen问题。实际上它失败了,因为在本地文件上使用file_get_contents实际上会获得文件的代码,而不是运行该文件的PHP处理结果。要使它按照您的需要工作,您需要通过在URL上添加“https:// localhost /”并启用allow_url_fopen来启动apache / PHP。

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

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

validatecard.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访问日志中。这是犯罪的疏忽,不要这样做。

另外,根据戈登的建议,确保你一直使用https。

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

答案 1 :(得分:0)

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

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

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