【问题标题】:Sanitizing text input before submitting to MySQL database在提交到 MySQL 数据库之前清理文本输入
【发布时间】:2013-02-04 17:07:23
【问题描述】:

我目前正在努力确保为我正在处理的 Web 应用程序提交到数据库中的文本在提交到数据库之前经过适当的清理,然后正确检索和显示。

忽略当前正在使用的杂乱无章的消毒功能(目前是一团糟并且破坏了东西),这就是我打算做的事情:

  1. 使用 CKEditor 进行文本输入。它会自动将 HTML 标记/符号转换为它们的 HTML 实体。

  2. 利用 PDO 准备语句将文本提交到数据库。

这足以正确清理输入吗?我一直在阅读这方面的内容,很多人说要使用魔术引号,但是我读到魔术引号很旧,并且大多数人建议不要使用它。

提前感谢您的帮助!

【问题讨论】:

  • 1.这很好,但是在使用站点正确使用数据(即在发出 HTML 时进行编码); 2. Prepared statements 消除了 SQL 注入,但它们消除了在其他地方不正确地使用数据(例如 XSS、HTML、exec 注入)。魔术引号是一个坏主意,它尝试过——但失败了——修复 #2 的地址。应该对业务规则进行“清理”,但要确保信息的正确性,而不是 [必要] 数据注入观点。
  • @pst 所以我应该按照其他人所说的去做,并在从数据库输出输入时使用 htmlspecialchars?这会干扰 CKEditor 用它们的实体替换 HTML 标签/符号吗?
  • 是的,总是编码输出! (除非有一个真的很好的理由不这样做。)我个人编码输入。否则,数据库中会出现一团 .. junk .. 。存储它应该的信息。虽然将“富文本”编辑器的内容转换为规范化格式(例如 markdown/markup/bbcode)可能是有意义的,但我不建议将其存储为“html 编码”,因为数据库不关心 HTML。但是,业务规则可能规定只允许使用 <em><a> 元素 - 现在应该强制执行 this,因为它是信息的部分

标签: php database pdo ckeditor sanitization


【解决方案1】:

不要使用魔术引号。 http://php.net/manual/en/security.magicquotes.php

此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。

如果您使用准备好的语句,那么您应该可以避免 sql 注入。记得在前端显示时通过htmlspecialchars()运行用户输入的数据。

【讨论】:

  • 因此,当显示来自数据库的信息时(将包含 ' 之类的 HTML 实体),我应该在向用户显示之前使用 htmlspecialchars 吗?
【解决方案2】:

好吧,PDO 仅适用于初学者手册中的基本案例。
任何复杂的问题都会给 PDO 以及任何其他 API 带来麻烦。

但是,只要您准备好浪费时间编写大量插入语句,在所有这些答案之后重复每个变量六到十次 - PDO 就可以了。

但只是为了让您知道,没有针对标识符的准备好的语句。

至于 CKEditor - 它不是一个客户端应用程序吗?如果是这样,它不会保护任何东西。
因此,最好遵循另一个答案的建议 - 在 HTML 页面上显示时通过 htmlspecialchars() 传递不受信任的用户输入

【讨论】:

  • 感谢您的回复。 CKEditor 是一个客户端应用程序。我决定使用它的原因之一是它用 HTML 实体替换了 HTML 标记和符号......使用该应用程序的用户有一个非常糟糕的习惯,即复制和粘贴他们发现的任何垃圾到应用程序中,所以 CKEditor有助于为进入数据库的内容设定标准。
猜你喜欢
  • 2016-04-23
  • 2015-09-17
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2013-10-16
  • 2020-06-13
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多