tildes - PHP Curl agrega ''/' para apostrofar el envío de caracteres a la página ASP
ver caracteres especiales php (3)
Tengo un servidor de terceros que tiene una página ASP clásica que toma los datos del formulario. Desde mi página web tengo un script PHP que envía campos a la página ASP utilizando curl. Todo funciona bien, excepto si un usuario incluye un carácter de apóstrofo en el texto. En la parte de atrás, se recibe como "/" ". Lo que es aún más extraño es que solo hace esto desde mi sitio web alojado. Cuando pruebo localmente funciona bien.
Aquí está el fragmento de PHP que envía los datos:
$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);
Asegúrate de tener deshabilitadas las comillas mágicas. Al ver cómo tus datos provienen de $_POST
, ese es el culpable más probable.
Probablemente necesites deshabilitar Magic Quotes en ese servidor en particular: http://php.net/manual/en/security.magicquotes.php
Además, puedes agregar este código al principio de tus scripts (mejor aún, en una biblioteca que incluyas en cada página) así que no importa el entorno, siempre obtendrás las comillas mágicas invertidas:
<?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);
}
?>
Tomado de http://php.net/manual/en/security.magicquotes.disabling.php
Use PHP filter_input()
para obtener las variables POST. Esto magic_quotes
si están habilitados y lo alentará a validar o desinfectar su entrada, según corresponda.
Este enfoque requerirá que conozca los nombres de las variables POST antes de tiempo, pero eso es algo bueno. Así es como podría verse:
$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