我最近改变了我的网络托管,但不幸的是管理员已经禁用了file_get_content和其他一些功能。
此脚本的目的是直接从设备获取iOS设备的信息。之前,我使用此代码执行此操作:
$content = file_get_contents('php://input');
file_put_contents("data.txt", $content);
结果就像这样(在data.txt中)
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IMEI</key>
<string>01 257233 621346 0</string>
<key>PRODUCT</key>
<string>iPhone2,1</string>
<key>SERIAL</key>
<string>5K1124GHEDG</string>
<key>UDID</key>
<string>07cc825055gftr4edsa3f06d0373376a7664a66a</string>
<key>VERSION</key>
<string>10B329</string>
</dict>
</plist>
由于在我的服务器上启用了Curl功能,我以不同的方式尝试了这段代码,但是没有用。 data.txt因此被清空了!
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, "php://input");
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$contents = curl_exec($ch);
curl_close($ch);
file_put_contents("data.txt", $contents);
更新:
让我解释它是如何运作的。我们将用户定向到存储在我们服务器上的配置文件(例如device.mobileconfig)。用户点击后,系统会要求他们安装。其内容是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<dict>
<key>URL</key>
<string>http://mywebsite.com/get.php</string>
<key>DeviceAttributes</key>
<array>
<string>UDID</string>
<string>VERSION</string>
<string>PRODUCT</string>
<string>SERIAL</string>
</array>
</dict>
<key>PayloadDescription</key>
<string>Install to get device info</string>
<key>PayloadDisplayName</key>
<string>UDID Finder</string>
<key>PayloadIdentifier</key>
<string>com.myud.ir</string>
<key>PayloadOrganization</key>
<string>MyUD.ir</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Profile Service</string>
<key>PayloadUUID</key>
<string>57A223FD-F675-90B1-8F43-22D3FC3BC181</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
配置文件运行get.php以从设备获取数据。我试过克里斯蒂安的那个,但没有用。我可能在某些地方犯了一个错误。 get.php是:
<?php
$xml = new SimpleXMLElement('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"/>');
$dict = $xml->addChild('dict');
foreach ($_POST as $item => $value) {
$dict->addChild('string', $item);
$dict->addChild('key', $value);
}
file_put_contents("data.txt", trim(str_replace('<?xml version="1.0"?>', '', $xml->asXML())));
?>
P.S。
我只需要
之间的数据<dict></dict>
答案 0 :(得分:0)
假设php://input
是一个允许您从请求主体读取原始数据的只读流,您可以通过获取$_POST
数据然后使用php {{{{{}}创建一个xml文档来解决此问题。 1}} class witch然后将被写入SimpleXMLElement
。
你可以这样做:
data.txt
另一种解决方案:
$xml = new SimpleXMLElement('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"/>');
$dict = $xml->addChild('dict');
foreach ($_POST as $item => $value) {
$dict->addChild('string', $item);
$dict->addChild('key', $value);
}
file_put_contents("data.txt", trim(str_replace('<?xml version="1.0"?>', '', $xml->asXML())));
答案 1 :(得分:-1)
非常感谢克里斯蒂安。有效。
我还发现了另一种方法,它是PEAR php组件,提供了许多功能,可以替代那些像我一样苦苦挣扎的人的主要php函数!
例如,在我的情况下,我将file_get_content函数上传到同一文件夹并包含在get.php中
而不是
$content = file_get_contents('php://input');
file_put_contents("data.txt", $content);
我现在正在使用
require_once 'file_get_contents.php';
$content = php_compat_file_get_contents('php://input');
file_put_contents("data.txt", $content);