PHP Curl添加了'\';撇号字符发送到ASP页面
我有一个第三方服务器,它有一个经典的ASP页面,它接收表单数据。在我的网页中,我有一个PHP脚本,它使用curl将字段发送到ASP页面。除非用户在文本中包含撇号字符,否则一切正常。在后端,它作为“\”接收。更奇怪的是,它只在我托管的网站上做这件事。当我在本地测试时,它运行良好 以下是发送数据的PHP代码段: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; }
$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答案的评论。