没有预准备语句或参数化查询的SQL注入

时间:2015-01-11 16:30:55

标签: php validation mysqli prepared-statement parameterized-query

我知道关于这个问题已经有很多问题,但我没有找到具体回答我的问题。

我创建了一个简单的PHP函数,用于验证所有用户提供的输入。鉴于我正在开发的应用程序的性质,很少需要使用除数字和字母之外的任何字符。偶尔使用逗号(,),连字符( - ),&符号(&)和单引号(')。我的PHP函数确保所有输入只包含这些字符,然后在其中一个符号的每个实例前添加一个反斜杠。

我假设如果我保证所有输入都是在用于MySQLi查询之前通过此函数发送的,那么我对SQL注入是安全的,并且不需要使用预准备语句,参数化查询等,仅关于安全性。 / p>

我说错了吗?

2 个答案:

答案 0 :(得分:3)

tl; dr NO

有许多攻击向量和许多不同类型的SQL Injection。例如,使用MySQLi类中的错误方法,您就会受到许多攻击。

只是不想考虑建立自己的东西,你会失败,你会失败的。遵循最佳实践并专注于其他部分,同时成为这个世界所见过的最棒的程序员。

最后一点,准备好的陈述为您提供了许多好处。虽然@Zanon提到的查询缓存但遗憾的是,如果你使用MySQL(例如PostgreSQL),它们就不是其中之一。但这取决于您使用的软件(及其确切版本)的文档。

答案 1 :(得分:0)

从我们在评论中的讨论中可以看出,您希望避免参数化查询的根本原因是因为您无法让mysqli_stmt_get_result()在MAMP下工作,因为它需要mysqlnd本机驱动程序。

实际上,这与您使用参数化查询或预准备语句的能力无关。它是对从预准备语句中获取绑定结果的常规方法的增强,而不是旧的(但仍然是标准且完全支持的)mysqli_stmt_bind_result(),这将在没有mysqlnd的情况下正常工作。

请使用参数化查询。如果您还想在没有mysqlnd驱动程序的情况下使用带有绑定结果变量的预准备语句,请使用mysqli_stmt_bind_result()而不是mysqli_stmt_get_result()

如果您在使用参数化查询时遇到任何问题,请发布一个新问题,其中包含您遇到问题的代码的完整最小示例。