我正在使用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 { ....
可能是什么问题?
答案 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请求