在没有转义的情况下将用户数据存储在数据库中

时间:2012-07-23 20:59:07

标签: php mysql

我的大多数问题都是理论性的,因为我认为“伟大的思想讨论思想”,而职员讨论语法。

无论如何..所以这是情况

我有一个系统从用户那里获取输入。但是在查询中根本没有使用该输入(根本没有)。此输入包含许多代码段。现在在过去我转义了输入,然后将其存储在数据库中。我不使用任何类型的添加和剥离斜杠函数,而是使用我自己的程序,使用preg_replace,如下所示

$data = preg_replace("/\;/", "&#59;", $data);//
$data = preg_replace("/</", "&lt;",   $data);
$data = preg_replace("/>/", "&gt;",   $data);
$data = preg_replace("/\"/", "&quot;",$data);
$data = preg_replace("/\(/", "&#40;", $data);

但是发生了以下问题。

有时软件会错误地逃避数据(因为我的软件没有错误),我无法找到实际数据。 我不时更新我的​​转义程序,这意味着不同的输入会以不同方式转义。

用户可以选择编辑他的帖子。因此,这意味着我必须向他提供转义数据(或取消数据),以防止数据转发两次...... 最后我得出结论,我将未转义的数据从用户直接保存到数据库中。并在显示之前将其转义(它没有其他用途..在查询等中没有用)。对于任何其他事情我没有改变原始数据。

我的问题::

即使未在查询中使用或在显示之前进行转义,数据库中未转义的用户数据仍然存在危险吗???

使用斜线等于/更好/不同的斜线逃逸,而不是通过追逐字符来逃避,例如&lt;进入&lt; ..

如果数据被正确转义(我的意思是所有特殊字符),它仍然可以用于XSS攻击。 SQL注入是不可能的。

2 个答案:

答案 0 :(得分:12)

从不对显示的数据进行编码,直到您实际要显示它。存储时,存储编码,传输时编码,传输编码等。适当的编码将适合您处理这些问题。

答案 1 :(得分:0)

是的,它可能很危险。用户可以轻松地注入代码以在数据库上运行自己的查询(即使您不打算查询此数据)。