<?php header('content-type: application/json');
$json = json_encode($data);
echo isset($_GET['callback'])
? "{$_GET['callback']}($json)"
: $json;
¿O debería, por ejemplo, filtrar la variable $_GET['callback']
para que solo contenga un nombre de función de JavaScript válido? Si es así, ¿cuáles son los nombres de función de JavaScript válidos?¿Esto es seguro para proporcionar JSONP?
¿O no está filtrando esa variable un poco con JSONP?
solución actual: blog acerca de mi solución actual en http://www.geekality.net/?p=1021. En resumen, por ahora, tengo el siguiente código, que se espera debe ser bastante segura:
<?php header('content-type: application/json; charset=utf-8');
function is_valid_callback($subject)
{
$identifier_syntax
= '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*+$/u';
$reserved_words = array('break', 'do', 'instanceof', 'typeof', 'case',
'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue',
'for', 'switch', 'while', 'debugger', 'function', 'this', 'with',
'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum',
'extends', 'super', 'const', 'export', 'import', 'implements', 'let',
'private', 'public', 'yield', 'interface', 'package', 'protected',
'static', 'null', 'true', 'false');
return preg_match($identifier_syntax, $subject)
&& ! in_array(mb_strtolower($subject, 'UTF-8'), $reserved_words);
}
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
$json = json_encode($data);
# JSON if no callback
if(! isset($_GET['callback']))
exit($json);
# JSONP if valid callback
if(is_valid_callback($_GET['callback']))
exit("{$_GET['callback']}($json)");
# Otherwise, bad request
header('Status: 400 Bad Request', true, 400);
Como JSONP es en realidad Javascript, el tipo mime sería 'text/javascript' (o' application/javascript'). –
@Casey: Ah, entonces ¿debería establecer el tipo de contenido a 'application/json' si callback no está configurado, y' application/javascript' si es? – Svish
Teóricamente, sí, pero no creo que muchos navegadores realmente presten atención al tipo de mimo. :) –