file_get_content的替代方法(php:// input)

时间:2014-06-13 18:25:39

标签: php ios curl file-get-contents udid

我最近改变了我的网络托管,但不幸的是管理员已经禁用了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>

2 个答案:

答案 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);