如何防止在LAMP应用程序中进行SQL注入?

时间:2020-03-05 18:48:35  来源:igfitidea点击:

以下是开始对话的几种可能性:

  • 初始化后转义所有输入。
  • 转义每个值,最好在生成SQL时转义。

第一种解决方案是次优的,因为如果要在除SQL之外的其他任何方式中使用每个值,则需要取消转义每个值,例如在网页上输出它。

第二种解决方案更有意义,但是手动转义每个值是一件痛苦的事情。

我知道已准备好的语句,但是我发现MySQLi麻烦。另外,将查询与输入分离也使我感到担忧,因为尽管正确执行订单至关重要,但很容易出错,从而将错误的数据写入错误的字段。

解决方案

回答

准备好的陈述是最好的答案。我们进行测试是因为我们可能会犯错误!

看到这个问题。

回答

我一直使用第一个解决方案,因为99%的时间,$ _GET,$ _ POST和$ _COOKIE中的变量永远不会输出到浏览器。我们也永远不会用SQL注入错误地编写代码(除非我们在查询中不使用引号),而使用第二种解决方案,我们很容易忘记最终会转义一个字符串。

实际上,我之所以一直这样做是因为我的所有站点默认情况下都启用了magic_quotes设置,并且一旦使用这两种解决方案之一编写了很多代码,就需要进行大量工作来进行更改到另一个。

回答

正如@Rob Walker所说,参数化查询是我们最好的选择。如果我们使用的是最新最好的PHP,我强烈建议我们看一下PDO(PHP数据对象)。这是一个本地数据库抽象库,它支持广泛的数据库(当然包括MySQL)以及带有命名参数的预备语句。

回答

我会使用准备好的语句。如果要使用准备好的语句,则可能要签出PHP的PDO函数。这不仅使我们可以轻松地运行准备好的语句,而且还可以通过不调用以mysql_,mysqli_或者pgsql_开头的函数,使我们与数据库无关。

回答

PDO有一天值得,但是还不止于此。这是一个DBAL,(据说)它的强项是使供应商之间的切换更加容易。它并不是真正能够捕获SQL注入的。

无论如何,我们想逃避和清理输入,使用准备好的语句可能是一个很好的方法(我赞成)。尽管我相信这要容易得多,例如通过使用过滤器。