【问题标题】:How to verify if "php://input" is set and not empty如何验证“php://input”是否设置且不为空
【发布时间】:2012-04-21 06:06:33
【问题描述】:

如何验证用户是否通过 XMLHttpRequest 向 PHP 发布了一些数据?

这是最好的方法吗?如果没有,我该怎么做?

我有以下代码

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
    // PROBABLY AJAX REQUEST
}

我的问题是,我如何验证php://input 存在且不为空?我认为以下代码可以完成工作,但需要知道这是否是正确的方法:

if(file_get_contents("php://input") == '') {
    // HAVE NOT POSTED
} else {
    // POSTED
}

【问题讨论】:

    标签: php xmlhttprequest


    【解决方案1】:

    将自定义标头设置为 AJAX 函数的一部分,并检查服务器端代码中是否存在该标头。

    也许最好的方法是在服务器端生成一个密钥,将它传递给包含 AJAX 调用的客户端代码,然后让 AJAX 将它发送回服务器并验证它是有效的密钥。这是防止有人伪造 AJAX 请求的最有效方法。


    要检查php://input 是否存在且不为空,请使用:

    $phpinput = file_get_contents("php://input");
    // From the docs: "Note: A stream opened with php://input can only be read once"
    if( !$phpinput) {
        // phpinput is empty
    }
    

    【讨论】:

    • 当我这样做时:file_get_contents("php://input");我不能再写一次,因为流将不可用?
    • 对。您只能读取该流一次,因此请立即将其放入变量中并进行处理。
    【解决方案2】:

    不能 100% 保证您能够确定是否使用 XMLHttpRequest 请求了脚本。您可以查看_SERVER['HTTP_X_REQUESTED_WITH'],但不保证在需要时设置或不设置时不设置。不过你可以试一试。

    【讨论】:

    • 好的,我有if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {,我的问题是,如何验证php://input 存在且不为空?
    • 数据应该通过常规的_POST或者_GET发送..为什么需要使用stdin?
    • 因为数据不是通过 POST 或 GET 发送的,无法详细解释,抱歉..
    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多