我正在网站上与开发团队合作。该网站将使用课程。我负责为类创建数据访问层。了解所有用户输入将在检索时(从帖子或获取)进行转义。几乎没有对输入级别的控制(除非我亲自审查每个人的代码),我认为在我的结尾处(在它到达数据库之前)也会很酷。问题是我不知道如何使用mysql_real_escape_string而不添加更多斜杠。
由于用户输入可能包含斜杠,我无法检查以确保其中有斜杠。我或许可以检查所有需要转义的东西并确保它们前面有斜线,但这似乎不是最好的方法。
有什么建议吗?
答案 0 :(得分:7)
如果您不知道输入是否已被转义,则无法添加自动决定是否转义。你可以尝试分析它,但它永远不会好,你会遇到双反斜杠对等。
一旦发送到您的访问层的数据应该干净并在一个地方处理转义,请做出决定。如果你这样做,其他开发人员将不必担心它(他们可能不想这样做)并且将来移动到另一个数据库会容易得多。它还可以让您随时自由地转到准备好的陈述。
编辑:忘记了这一点:
几乎无法控制输入 水平(除非我个人审查 每个人的代码)
我认为让他们自己发现它是值得的,如果你只是明确表示转义属于数据库层而不应该在其他地方完成。
答案 1 :(得分:7)
在您访问数据访问层之前,您是否认为不转义数据?我问,因为他们对你的团队正在采取的方法有些困惑:
'
对HTML不是特殊的)然后重新转义数据(因为<
是特殊的)。如果您需要向从用户拉出的用户显示表单数据,则不能执行该转义步骤(因为它是由数据库完成的,当保存数据时),但仍然必须执行HTML转义步骤。如果您犯了错误并执行了错误的操作,则会损坏数据或导致更严重的安全问题。\'
对您的数据库意味着什么? '
或\
如何逃脱 - 如果有的话?如果您更改了数据库引擎,甚至更改了其设置,那些可能会发生变化。然后你就可以找到一堆转义/解除转义的代码。缺少单个转义/解除转义可能会导致SQL注入。还有另一种方法:让任何需要数据转义的图层逃脱它本身。数据总是以原始的非转义形式在层之间传递。因此,您的数据访问层会进行所有数据库转义。您的HTML输出代码执行所有HTML转义。当您决定要生成PDF时,您的PDF代码会执行所有PDF转义。
答案 2 :(得分:0)
如果我在你的位置,我不会懒得不回顾每个人的代码。即使您没有检查用户输入的转义,您仍然可能希望查看其代码是否有效完成。或许,这不是你进行审查,但有人必须这样做。
我很久以前就经历过几乎相似的设置,我们按层分割任务。一个人在模型上工作,我在控制器上工作,另一个工作在视图上。因为我们非常信任所有人,所以其他人的代码将按照我们期望的方式工作,所以在我们需要合并它们之前,我们没有费心去查看其他代码。发生的事情是我们在开发后期发现模型中的低效代码。它不仅效率低下,而且不起作用!因此,我们不得不彻底检查大量的代码,这会花费我们更多的时间。
我建议您创建一个技术要求规范文档,其中指定了用户可接受的输入。该文档后面应该是那些将接受用户输入的部分编码的人。更好的是,创建单元测试以确定是否严格遵守这些要求,这样您就不必担心他们要传递给您的数据是否无效。
另一件事......既然你正在使用PHP,为什么不使用一个好的框架呢?大多数可用的框架都带有自己的DAL,您不再需要担心转义数据库输入(嗯,不是那么多)。框架应该为你做。
此外,您可能希望查看“预备语句”。