php - 只逃避必要的东西,这可能吗?

标签 php mysql

我正在与一个网站开发团队合作。该网站将使用类。我负责为类创建数据访问层。有一种理解是,所有用户输入都将在检索时被转义(从 post 或 get)。由于对输入级别几乎没有控制(除非我亲自审查每个人的代码),我认为在我这边也加入转义会很酷(就在它到达数据库之前)。问题是我不知道如何在不添加更多斜线的情况下使用 mysql_real_escape_string。

由于用户输入很可能包含斜线,我无法检查以确保其中有斜线。我也许能够检查所有需要转义的东西并确保它们前面有斜线,但这似乎不是最好的方法。

有什么建议吗?

最佳答案

您是否考虑过在数据到达数据访问层之前转义数据?我问,因为他们是您的团队正在采用的方法的一些问题:

  • 如果您需要向用户显示表单数据(例如,由于某些验证失败而重新显示带有错误消息的表单),您需要对数据进行反转义(因为 ' 对 HTML 而言并不特殊)和然后重新转义数据(因为 < 很特殊)。如果您需要向用户显示从数据库中提取的表单数据,您一定不能执行该反转义步骤(因为它是由数据库在保存数据时完成的),但仍然必须执行 HTML 转义步骤。如果您犯了错误并执行了错误的程序,就会损坏数据或更糟的是会引入安全问题。
  • 您可以处理来自不同来源的不同格式问题,方法是决定转义在您的应用中传递的所有数据。因此,您的数据访问层将在从数据库中获取数据时重新转义数据。但是,由于应用程序的不同部分需要稍微(或完全)不同的转义,这很快就会导致大量的去转义/重新转义废话。从数据库中抓取数据,转义,反转义,转义成HTML,输出。
  • 您的前端表单处理代码必须非常了解您的数据库。例如,\' 是什么意思?对你的数据库意味着什么? '应该怎么弄或 \逃避——如果有的话?如果您更改数据库引擎,甚至更改其设置,这些都可能会发生变化。然后你有一堆转义/反转义代码可以找到。缺少单个转义/反转义可能会导致 SQL 注入(inject)。
  • 或者,您可以让数据库层执行反转义/转义循环,将您的应用标准转义序列转换为数据库的转义序列,从而从前端代码中获取数据库知识。但这似乎很愚蠢!

还有另一种方法:让需要转义数据的层自己转义。数据总是以原始的、未转义的形式在层之间传递。所以你的数据访问层做所有的数据库转义。您的 HTML 输出代码执行所有 HTML 转义。当您决定要生成 PDF 时,您的 PDF 代码会执行所有 PDF 转义。

  • 现在,当您进行表单输出时,该做什么就很清楚了:始终对数据进行 HTML 转义。不管它来自哪里。永远不要运行 de-escape。
  • 现在没有 de-escape/escape 废话,因为一切都是原始的。它只在必要时转义。
  • 您的前端代码不关心数据访问层的实现。数据访问层存储和返回任意字符串。
  • 您只有一个地方可以查看您的应用程序,以确保您没有 SQL 注入(inject)问题。
  • 您可以轻松地使用占位符等数据库驱动程序功能。这样,即使您的数据访问层也不需要知道每个数据库的转义要求;数据库驱动程序处理它。

关于php - 只逃避必要的东西,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1152080/

相关文章:

mysql - MySQL VB.Net 中的时间范围验证

php - 您将如何自动检测 Textile 与 Markdown?

php - 如何检查一组记录是否相等?

mysql - 如何在mysql workbench中安排工作

mysql - 如何从mysql表的前3行中获取最小值

mysql - 如何统计MySQL中两个不同表的记录数

php - 我可以在选择要上传的图像文件后触发表单操作吗?

php - 如何使用 PHP 打破 MySQL 查询的束缚?

php - 检查两个给定开始时间和结束时间之间是否存在时间范围

php - Magento 中的 isBundle()?