当用户在 html 表单上输入 " 或 \ 时出现问题
输入的文本将在 html 内容和 html 属性上下文中再次显示给用户
我有以下数据流:
- jQuery 表单行输入
- $_POST
- html 属性的转义:函数使用 html 实体或十六进制实体(
"
或\
)转义 - php中的json_encode
- 一些未知的 javascript 干扰,这会烧断保险丝
- jquery ajax 回调中的 json_parse
目标是向用户显示与输入完全相同的文本,但要正确转义以避免 xss 攻击。
现在我得到的第一件事是 $_POST 由于某种原因添加了斜杠。所以我现在首先使用stripslashes。这解决了单引号的所有问题,但是如果用户输入 " 或 \ 它仍然会中断。
问题似乎是javascript在 json_parse 获取数据之前进行了一些解码。它将十六进制转义符转回 \ 和 " 从而杀死 json_parse.
所以我想如果在第 4 步和第 5 步之间我使用 htmlspecialchars( $data, NO_QUOTES, 'utf-8' ) 我将 & 符号编码为&
,这应该中和 javascript 解码,但没有。它&
在解码 " 和十六进制编码时由于某种原因没有解码......
我哪里错了?有没有办法确切地知道 javascipt 解码并从 php 中和它?
在浪费了半天之后,我现在在做什么:
我认为在 onsuccess 处理程序获取数据之前干扰数据可能是一些 jQuery 的事情。我现在没有时间挖掘它并杀死它,所以我只是偷偷摸摸地用一个 hack 偷偷摸摸,这意味着 3 个字符串转换只是为了保持一个字符串不被转换,但是嘿,开发人员的时间在这里是一种稀有的商品。
在 php 中:
// due to a problem with the jQuery callback code which seems to decode html entities and hex entities except for &
// we need to do something to keep our data intact, otherwise parse_json chokes on unescaped backslashes
// and quotes. So we mask the entity by transforming the & into & here and back in js.
// TODO: unit test this to prevent regression
// TODO: debug the jQuery to avoid this workaround
//
// echo json_encode( $response );
echo preg_replace( '/&/u', '&', json_encode( $response ) );
在 parse_json 之前的 js 中:
// due to a problem with the jQuery callback code which seems to decode html entities and hex entities except for &
// we need to do something to keep our data intact, otherwise parse_json chokes on unescaped backslashes
// and quotes. So we mask the entity by transforming the & into & here and back in js.
// See function xxxxxx() in file xxxxx.php for the corresponding transformation
//
responseText = responseText.replace( /&/g, '&' );
目前我无法为它编写单元测试,但我似乎无法打破它。
真正的问题仍然是如何在获得相同结果的同时消除不需要的转换?