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

Jus*_*ney 7 php mysql

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

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

有什么建议?

Fre*_*rik 7

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

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

编辑:忘了这个:

几乎无法控制输入级别(除非我亲自审查每个人的代码)

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

  • 为'处理在一个地方逃跑'的+1.希望我能为你提供+5 ;-) (3认同)

der*_*ert 7

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

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

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

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