2011-02-22 77 views
0

我有一个JavaScript丰富的页面,传递一个大的JSON格式化为PHP将放入MySQL数据库。 JSON中的数据包括用户提交的字符串,并将包含包含基本html的字符串(<a><strong>等)。如何在MySQL中对数据库存储的json数据进行编码?

我遇到的问题是,当含有'引号的字符串被转义,我不能剥夺斜线,导致复合逃逸像

<a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a> 

每当用户节省这加剧,严重腹胀数据库字段。

我的字符串转换将数据插入到MySQL是:

$correspondenceArray = base64_encode(json_encode($_POST['saveArray']['correspondenceObject'])); 

而要找回数据为:

function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
       array_map('stripslashes_deep', $value) : 
       stripslashes($value); 

    return $value; 
} 

$correspondenceJSON = stripslashes_deep(json_decode(base64_decode($resultArray['correspondence_array']), true)); 

从我已经做了我的意图是要剥离上的数据斜杠来自数据库,所以javascript有非转义数据

编辑

我意识到json_encode($a,JSON_HEX_QUOT)将可能有所帮助,但我运行的服务器有PHP 5.2.16使功能不可用)

+1

你有'magic_quotes_gpc()'打开了吗?那些垃圾会将你所有的数据全部删除,并且该选项应该被关闭。 – 2011-02-22 22:31:13

+0

啊,没有打开。嗯,如果我把它关掉,我可能会在其他地方产生影响? – 2011-02-22 22:36:22

+0

你可能想在你的查询中使用mysql_real_escape_string(),当你关闭它以避免恶意注入时,但是@Marc B是正确的,你应该关闭它(它在PHP 5.3中不赞成使用)。 – Capsule 2011-02-22 22:41:22

回答

3

不要使用字符串代的SQL。

如果使用占位符会有没有问题(带存储)和没有神奇的转义需要。只需将其存储为VARCHAR类型即可。完成并完成。

消毒用于输出(和输入期间)同样应该使用适当的库来完成 - 有两种不同的操作;然而,这是一个单独的问题比存储。

编辑

PDO为一个准备好的声明(读:占位符)实现。其他可能存在(我不使用PHP,但觉得有义务纠正有关手动内置基于字符串的SQL查询设计错误的延续。)

到预处理语句的参数不需要是引;驱动程序自动处理这个。 如果应用程序独占使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果正在使用未转义的输入构建查询的其他部分,则仍然可以执行SQL注入)。

听起来太好了,是真的。现在使用字符串生成的语句退出。请。

快乐编码。

+0

问题是我编码的对象是一个非常深的多维数组(目前深达5层)并且完全动态。 – 2011-02-22 23:05:41

+0

@Zak Henry这不会改变我的答案。 JSON是文本。 **如果在SQL语句中使用*占位符*(又名“准备语句”),则文本可以安全地存储在数据库中,而不会“转义”。请参阅:http://php.net/manual/en/pdo.prepared-statements.php或类似的 - 不好的设计必须死亡。使用准备好的语句也可以 - 理论上(取决于许多因素,包括后端,适配器和使用模式) - 显着提高性能。 – 2011-02-22 23:49:31

+1

不幸的是,PDO看起来像它使用了一些愚蠢的实现并引用了变量 - 但无论如何,它都是从一个糟糕的方法到一个可接受的方法。 – 2011-02-22 23:55:30

相关问题