0

我有一个带有字段的表单和一个允许输入任何字符的文本区域。我不能只提交表单,因为表单被多次回收,所以表单值存储在关联数组中:

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

我在参数列表后收到 ERROR: SyntaxError: Expected token ')' OR SyntaxError: missing )


这对我来说很奇怪 - 因为当我在没有 POSTING 的情况下尝试它时 - 它似乎像这样工作正常:

document.getElementById('package').value = JSON.stringify(myArray[0]);

现在,如果我尝试将字符串化值传回数组

myArray[0] =  JSON.parse(document.getElementById('package').value);

- 它似乎工作正常 - 没有错误


问题:

  • 为什么在尝试从POSTED JSON.stringify()值重建 ARRAY 时出现此错误?
  • 我是否将这个 JSON.stringify() 值按原样保存在 MySQL 中?
  • 还是我先 PHP json_decode()它?

我想获取表单数据 - 正确处理 - 将其存储在 MySQL 中,然后在需要时将其读回表单中。

谢谢大家:)

4

1 回答 1

0
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>可以安全地放置在脚本元素中(因为这就是 PHP 的json_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 字符串存储在数据库中。但是,这会失去很多灵活性,并且将来可能会咬到您。

于 2013-01-30T09:41:11.277 回答