【问题标题】:Storing user data in database with out Escaping在没有转义的情况下将用户数据存储在数据库中
【发布时间】:2012-07-23 20:59:06
【问题描述】:

我的大部分问题本质上都是理论性的,因为我认为“伟大的头脑讨论想法”而职员讨论语法。

无论如何.. 情况就是这样

我有一个从用户获取输入的系统。但查询中没有使用任何输入(根本没有)。这个输入包含很多代码sn-ps。现在过去我转义了输入,然后将其存储在数据库中。我不使用任何类型的添加和剥离斜杠功能,而是使用我自己的使用 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);

但是出现了以下问题。

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

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

我的问题::

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

用斜线转义是否等于/更好/不同于通过将字符转义例如

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    永远不要编码数据以供显示直到你真正要显示它。存储时编码存储,传输时编码传输等。在适当的时候适当的编码将为您处理这些问题。

    【讨论】:

    • 这么短却这么棒的答案。 +1
    • 我还要添加“永远不要编写自己的转义函数”。
    • 哦...你说得太有道理了..你能引导我到某个地方阅读更多关于...什么是显示编码...什么是存储编码... .谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多