【问题标题】:PHP Curl adds '\' to apostrophe character sending to ASP pagePHP Curl 添加 '\' 到撇号字符发送到 ASP 页面
【发布时间】:2009-11-13 19:54:52
【问题描述】:

我有一个第 3 方服务器,它有一个经典的 ASP 页面,它接收表单数据。在我的网页中,我有一个 PHP 脚本,它使用 curl 将字段发送到 ASP 页面。除非用户在文本中包含撇号字符,否则一切正常。在后端,它作为“\'”接收。更奇怪的是,它只在我托管的网站上执行此操作。当我在本地测试时,它工作正常。

这是发送数据的 PHP sn-p:

$datatopost = array (); 
foreach($_POST as $key => $data) {
    $datatopost[$key] = $data;
}

$ch = curl_init("http://my.server.com/validate.asp");
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $datatopost);
$result =  curl_exec($ch);

【问题讨论】:

  • 听起来像是字符串转义出错了。

标签: php curl asp-classic


【解决方案1】:

您可能需要在该特定服务器中禁用 Magic Quotes:http://php.net/manual/en/security.magicquotes.php

此外,您可以将此代码添加到脚本的顶部(更好的是,在您包含在每个页面中的库中),因此无论环境如何,您总是会得到相反的魔术引号:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

取自http://php.net/manual/en/security.magicquotes.disabling.php

【讨论】:

  • 谢谢!这解决了它。我只需要将该脚本添加到顶部。
  • -1 用于处理未过滤的输入。恶意用户可以使此代码递归到任意深度。
  • @Ben Dunlap:Curl 自己处理。除非您指的是stripslashes_deep,在这种情况下,我将指出addslashes 已经在输入上运行(否则get_magic_quotes_gpc() 将返回false)。
  • 是的,我指的是 stripslashes_deep() (因此有关于递归的注释)。我的观点是 PHP 开发人员不应该编写处理未过滤输入的代码,并且我指出了上面代码的潜在安全问题,以进行说明。如果 PHP 在内部处理未过滤的输入(这是唯一会由 get_magic_quotes_gpc() 的 TRUE 返回值指示的内容)——那么这也可能是一个问题,但这并不是 Web 开发人员可以控制的真正问题。
  • @Ben 你能说得更具体些吗?在 PHP 已经处理的输入上运行时,我看不出一个简单的带斜杠会受到怎样的伤害......
【解决方案2】:

确保您禁用了魔术引号。查看您的数据如何来自$_POST,这很可能是罪魁祸首。

【讨论】:

    【解决方案3】:

    使用 PHP 的 filter_input() 获取 POST 变量。如果启用了magic_quotes,这将绕过它们,并鼓励您根据需要验证或清理您的输入。

    这种方法需要您提前知道 POST 变量的名称,但这是件好事。以下是它的外观:

    $expected_keys = array(
        'foo',
        'bar',
        // etc.
    );
    
    $datatopost = array();
    
    foreach ($expected_keys as $expected_key) {
        $value = filter_input(INPUT_POST, $expected_key, <filter>, [<options>]);
    
        if ($value !== FALSE && !is_null($value)) {
            $datatopost[$expected_key] = $value;
        }
    }
    
    // CURL code here
    

    【讨论】:

    • 顺便说一句,这仅适用于 PHP >= 5.2.0
    • 好点,但是 PHP 5.2.0 又是 3 年前发布的。 @Seb 的答案在 cmets 中有更多内容。
    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多