1

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

为了正确显示我使用的 HTML 输入stripslashes()

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

你有什么意见?stripslashes会严重影响性能吗?

4

5 回答 5

3

不要使用. _ stripslashes()就安全性而言,它完全没有用,也没有额外的好处。这种做法来自“魔术引号”的黑暗时代,这是过去的事情,在下一个 PHP 版本中已被淘汰。

相反,只过滤输入:

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

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

编辑:如果你必须做stripslashes()的输出看起来正确,那么很可能你打开了魔术引号。一些 CMS 甚至犯了一个严重的错误来做他们自己的魔术引号(例如:Wordpress)。始终按照我上面的建议进行过滤,关闭魔术引号,你应该没问题。

于 2011-08-18T21:47:43.300 回答
1

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

于 2011-08-18T21:43:41.720 回答
1

不,不要逃避它。请改用准备好的语句。以原始格式存储您的数据,并根据需要对其进行处理以供显示 - 例如,在显示用户提供的 HTML 时使用合适的方法来防止 Javascript 执行。

有关此主题的更多信息,请参阅 Bill Karwin 的Sql Injection Myths and Fallacies 演讲幻灯片

请参阅HTML Purifierhtmlspecialchars,了解几种过滤 HTML 以输出的方法。

于 2011-08-18T22:13:27.883 回答
0

最好始终清除您的数据中潜在的恶意或被忽略的特殊字符,这些字符可能会引发错误或损坏您的数据库。

根据 PHP 文档,它甚至说“如果不使用此函数来转义数据,则查询很容易受到SQL 注入攻击。”

于 2011-08-18T21:43:51.010 回答
0

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

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

于 2011-08-18T22:21:04.177 回答