我在数据库中保存数据时是否真的需要使用mysql_real_escape_string?

时间:2011-08-18 21:41:32

标签: php mysql mysql-real-escape-string stripslashes

我正在使用mysql_real_escape_string来保存mySQL数据库中的内容。我保存的内容是通过表单的HTML。我删除并重新上传在需要时写入DB的PHP文件。

要正确显示我的HTML输入,请使用stripslashes()

在其他情况下,当我在没有mysql_real_escape_string的情况下插入它时,我不会在输出中使用stripslashes()

你有什么看法? stripslashes会严重影响效果吗?

5 个答案:

答案 0 :(得分:3)

使用stripslashes()。它在安全性方面完全无用,并没有额外的好处。这种做法来自于“魔术引语”的黑暗时代,这是过去已经在下一个PHP版本中消除的事情。

相反,只过滤输入:

  • string:mysql_real_escape_string($data)
  • 整数:(int)$data
  • 浮动:(float)$data
  • 布尔值:isset($data) && $data

输出是另一回事。如果要存储HTML,则需要根据javascript过滤HTML。

修改:如果您必须执行stripslashes()输出才能正常显示,那么大多数情况下您都会启用魔术引号。一些CMS甚至犯了严重的错误来做自己的魔术引用(例如:Wordpress)。总是按照我的建议过滤,关闭魔术引号,你应该没事。

答案 1 :(得分:1)

不要考虑性能,考虑安全性。每次将数据插入数据库时​​都使用mysql_real_escape_string

答案 2 :(得分:1)

不,不要逃避它。请改用prepared statements。以原始格式存储数据,并根据需要进行处理以进行显示 - 例如,使用合适的方法在显示用户提供的HTML时阻止Javascript执行。

有关此主题的更多信息,请参阅Bill Karwin的 Sql Injection Myths and Fallacies talkslides

有关过滤HTML输出的几种方法,请参阅HTML Purifierhtmlspecialchars

答案 3 :(得分:0)

最好为可能存在错误或损坏数据库的潜在恶意或被忽视的特殊字符清理数据。

根据PHP文档,它甚至会说“如果此函数不用于转义数据,则查询容易受到SQL Injection Attacks的攻击。”

答案 4 :(得分:0)

查看一个数据库抽象库,它可以自动完成所有这些操作,例如http://adodb.sourceforge.net/上的ADOdb

它解决了其他人提出的许多问题,例如安全性/参数化。我怀疑任何保存的性能都值得开发人员在每次查询时手动完成所有操作,或者牺牲安全实践。