PHP Curl添加了'\';撇号字符发送到ASP页面

PHP Curl添加了'\';撇号字符发送到ASP页面,php,curl,asp-classic,Php,Curl,Asp Classic,我有一个第三方服务器,它有一个经典的ASP页面,它接收表单数据。在我的网页中,我有一个PHP脚本,它使用curl将字段发送到ASP页面。除非用户在文本中包含撇号字符,否则一切正常。在后端,它作为“\”接收。更奇怪的是,它只在我托管的网站上做这件事。当我在本地测试时,它运行良好 以下是发送数据的PHP代码段: $datatopost = array (); foreach($_POST as $key => $data) { $datatopost[$key] = $data; }

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

以下是发送数据的PHP代码段:

$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
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);
}
?>


摘自

确保禁用了魔法引号。查看您的数据是如何来自
$\u POST
,这是最可能的罪魁祸首。

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

这种方法要求您提前知道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
$expected\u keys=数组(
"福",,
“酒吧”,
//等等。
);
$datatopost=array();
foreach($expected\u key作为$expected\u key){
$value=filter\u input(input\u POST,$expected\u key,[]);
如果($value!==FALSE&&!为null($value)){
$datatopost[$expected_key]=$value;
}
}
//这里是CURL代码

听起来好像字符串转义出错了。谢谢!这把它修好了。我只需要将该脚本添加到顶部。-1用于处理未过滤的输入。恶意用户可导致此代码递归到任意深度。@Ben Dunlap:Curl自行处理。除非你指的是stripslashes\u deep,在这种情况下,我要指出addslashes已经在输入上运行过(否则get\u magic\u quotes\u gpc()将返回false)。是的,我指的是stripslashes\u deep()(因此需要注意递归)。我的观点是PHP开发人员不应该编写处理未过滤输入的代码,我指出了上面代码的一个潜在安全问题,以示说明。如果PHP在内部处理未过滤的输入(这是唯一由get_magic_quotes_gpc()的真实返回值表示的内容)——那么这可能也是一个问题,但这并不是web开发人员可以控制的问题。@Ben,你能更具体一点吗?我不认为一个简单的stripslashes在PHP已经处理过的输入上运行时会有什么影响…顺便说一句,这只在PHP>=5.2.0中可用。好的一点,但PHP5.2.0还是在3年前发布的。更多关于@Seb答案的评论。