hi tami,
hi molily,
Habe mal geschaut, wie Ruby on Rails das macht, ein vom Umfang her vergleichbares Webframework.
Rails 4 überschreibt die to_json-Methode von Hashes, sodass gefährliche Zeichen in Strings im JSON mit Unicode-Escape-Sequenzen kodiert werden.
Der Ruby-Hash
{foo: '</script><script>alert(/XSS/)</script>'}
wird durch to_json zum JSON
{"foo":"\u003C/script\u003E\u003Cscript\u003Ealert(/XSS/)\u003C/script\u003E"}
{"foo":"\u003C\/script\u003E\u003Cscript\u003Ealert(\/XSS\/)\u003C\/script\u003E"}
bringt mir:
<?php
require_once 'Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));
$loader->register();
class ToJason {
public $foo = '</script><script>alert(/XSS/)</script>';
}
$phpNative = new ToJason;
$json = Zend\Json\Json::encode($phpNative);
var_dump($json);
in der Encoder.php dann für Strings:
~~~php
/**
* JSON encode a string value by escaping characters as necessary
*
* @param string $string
* @return string
*/
protected function _encodeString(&$string)
{
// Escape these characters with a backslash or unicode escape:
// " \ / \n \r \t \b \f
$search = array('\\', "\n", "\t", "\r", "\b", "\f", '"', '\'', '&', '<', '>', '/');
$replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\\u0022', '\\u0027', '\\u0026', '\\u003C', '\\u003E', '\\/');
$string = str_replace($search, $replace, $string);
// Escape certain ASCII characters:
// 0x08 => \b
// 0x0c => \f
$string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
$string = self::encodeUnicodeString($string);
return '"' . $string . '"';
}
mfg
tami
mfg
tami