我有一个包含字段和文本区域的表单,允许输入任何字符。我不能只提交表单,因为表单被多次回收,因此表单值存储在关联数组中:
<form name='Theform'>
<input type="text" id="VISITOR_DETAILS_NAME" value="Joe">
<input type="text" id="VISITOR_DETAILS_SIZE" value="Large">
<textarea id='VISITOR_DETAILS_INFO'>
User can enter anything here including double " and single ' quotes
</textarea>
<input type="hidden" name="package" id="package" value="" />
</form>
文本区域值与其他表单值一起存储在 JavaScript 数组中:
myArray[0]['VISITOR_DETAILS_NAME'] = document.getElementById('VISITOR_DETAILS_NAME').value;
myArray[0]['VISITOR_DETAILS_SIZE'] = document.getElementById('VISITOR_DETAILS_SIZE').value;
myArray[0]['VISITOR_DETAILS_INFO'] = document.getElementById('VISITOR_DETAILS_INFO').value;
我最终得到一个这样的数组:
{
VISITOR_DETAILS_NAME : "Joe",
VISITOR_DETAILS_SIZE : "Large",
VISITOR_DETAILS_INFO : "User can enter anything here including double " and single ' quotes"
};
然后,我使用 JSON.stringify 将此 JavaScript 数组传递给隐藏的表单字段,然后将其发布到 PHP:
document.getElementById('package').value = JSON.stringify(myArray[0]);
Theform.submit();
(现在我只是发布到 iframe 以测试JSON 是否通过 POST 正确传递 JavaScript 数组)。
当我在 PHP 端得到它时 - 它似乎很好。看起来 JSON.stringify 在双引号 (''" ) 中添加了反斜杠 - 现在我想将值存储在 MySQL 中。但是我想首先测试是否可以将 JSON 作为数组发送/重建回 javascript - 所以我尝试这样做:
parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');
我收到一个错误:语法错误:预期的标记")"或语法错误:参数列表后缺少 )
这对我来说很奇怪 - 因为当我在没有 POST 的情况下尝试它时 - 它似乎像这样工作正常:
document.getElementById('package').value = JSON.stringify(myArray[0]);
现在,如果我尝试将字符串化值传回数组
myArray[0] = JSON.parse(document.getElementById('package').value);
- 它似乎工作正常 - 没有错误
问题:
- 为什么我在尝试从发布 JSON.stringify() 值?
- 我是否按原样将此 JSON.stringify() 值保存在 MySQL 中?
- 还是我先用PHP json_decode()?
我想获取表单数据 - 正确处理它 - 将其存储在MySQL中,然后在需要时将其读回表单中。
谢谢大家:)
parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');
在这里,您正在尝试将 JSON 文本转换为 JSON 文本的 JavaScript 字符串表示的 HTML 表示形式,但您没有做任何事情来转义它。
如果 JSON 数据中有任何'
字符,则它们将终止 JavaScript 字符串。
如果 JSON 数据中有任何"
字符,则它们将表示为 '"
,但'"
是 "
的 JavaScript 字符串表示形式。由于您不执行任何操作来转义放入 JS 字符串中的文本,因此斜杠字符将被 JavaScript 解析器使用,并且在到达 JSON 解析器之前将消失。
如果你想转换数据以放置在JavaScript字符串中,那么你需要转义它。
但是,JSON是JavaScript的一个子集(几乎)。因此,将 JSON 文本转换为 JavaScript 字符串以便将其解析为 JavaScript 对象的过程过于复杂。您可以跳过它,直接转到:
<script>
var foo = <?php echo $json; ?>
</script>
但是,由于您从客户端接收 JSON,因此直接回显会使您面临 XSS 攻击。为了解决这个问题,你应该过滤服务器上的数据。
这将:
- 无法解析任何无效的 JSON,因此不会输出错误的 JSON(但它可能不输出任何内容,从而产生 JSON 语法错误,您应该应用测试以查看解析是否成功,如果解析失败,则输出合理的默认情况)。
- 将数据中的任何
</script>
转换为<'/script>
使其安全地放置在脚本元素中(因为这就是 PHPjson_encode
的工作方式
这样:
<!-- I don't do PHP, this is untested -->
<script>
var foo = <?php
$unsafe_json = $_POST['package'];
$data_structure = json_parse($unsafe_json);
$safe_json = json_encode($data_structure);
echo $safe_json;
?>;
</script>
我是否按原样将此 JSON.stringify() 值保存在 MySQL 中?还是我先用PHP json_decode()?
这取决于您打算如何处理数据。通常,在将内容放入数据库时,最好从数据格式中额外获取数据并将其规范化。这样,您就可以对其运行查询。
如果您只打算存储数据然后检索它,则可以不这样做并将 JSON 字符串存储在数据库中。不过,这会失去很多灵活性,将来可能会咬您。