只有逃避必要的东西才有可能吗?

时间:2009-07-20 07:14:43

标签: php mysql

我正在网站上与开发团队合作。该网站将使用课程。我负责为类创建数据访问层。了解所有用户输入将在检索时(从帖子或获取)进行转义。几乎没有对输入级别的控制(除非我亲自审查每个人的代码),我认为在我的结尾处(在它到达数据库之前)也会很酷。问题是我不知道如何使用mysql_real_escape_string而不添加更多斜杠。

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

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

如果您不知道输入是否已被转义,则无法添加自动决定是否转义。你可以尝试分析它,但它永远不会好,你会遇到双反斜杠对等。

一旦发送到您的访问层的数据应该干净并在一个地方处理转义,请做出决定。如果你这样做,其他开发人员将不必担心它(他们可能不想这样做)并且将来移动到另一个数据库会容易得多。它还可以让您随时自由地转到准备好的陈述。

编辑:忘记了这一点:

  

几乎无法控制输入   水平(除非我个人审查   每个人的代码)

我认为让他们自己发现它是值得的,如果你只是明确表示转义属于数据库层而不应该在其他地方完成。

答案 1 :(得分:7)

在您访问数据访问层之前,您是否认为转义数据?我问,因为他们对你的团队正在采取的方法有些困惑:

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

还有另一种方法:让任何需要数据转义的图层逃脱它本身。数据总是以原始的非转义形式在层之间传递。因此,您的数据访问层会进行所有数据库转义。您的HTML输出代码执行所有HTML转义。当您决定要生成PDF时,您的PDF代码会执行所有PDF转义。

  • 现在,当你进行表单输出时,它清楚该怎么做:总是HTML转义数据。无论它来自哪里。永远不要逃避。
  • 现在没有de escape / escape废话,因为一切都是在原始的传递。它只在必要时才被逃脱。
  • 您的前端代码不关心数据访问层的实现。数据访问层存储并返回任意字符串。
  • 您只有一个位置可以查看您的应用,以确保您没有SQL注入问题。
  • 您可以轻松使用数据库驱动程序功能,例如占位符。那么即使您的数据访问层也不需要了解每个数据库的转义要求;数据库驱动程序处理它。

答案 2 :(得分:0)

如果我在你的位置,我不会懒得不回顾每个人的代码。即使您没有检查用户输入的转义,您仍然可能希望查看其代码是否有效完成。或许,这不是你进行审查,但有人必须这样做。

我很久以前就经历过几乎相似的设置,我们按层分割任务。一个人在模型上工作,我在控制器上工作,另一个工作在视图上。因为我们非常信任所有人,所以其他人的代码将按照我们期望的方式工作,所以在我们需要合并它们之前,我们没有费心去查看其他代码。发生的事情是我们在开发后期发现模型中的低效代码。它不仅效率低下,而且不起作用!因此,我们不得不彻底检查大量的代码,这会花费我们更多的时间。

我建议您创建一个技术要求规范文档,其中指定了用户可接受的输入。该文档后面应该是那些将接受用户输入的部分编码的人。更好的是,创建单元测试以确定是否严格遵守这些要求,这样您就不必担心他们要传递给您的数据是否无效。

另一件事......既然你正在使用PHP,为什么不使用一个好的框架呢?大多数可用的框架都带有自己的DAL,您不再需要担心转义数据库输入(嗯,不是那么多)。框架应该为你做。

此外,您可能希望查看“预备语句”。