在不使用预准备语句的情况下截断表是否安全?

时间:2014-04-09 15:18:06

标签: php pdo sql-injection truncate

我在当前项目中使用了以下几种代码来清除一些表格。如果我不熟悉我使用PDO。

 $clearResult = $db->query('TRUNCATE TABLE table_name');

我目前正在浏览并更新我之前的一些脚本,以确保它们都使用预处理语句,并以减少(希望停止)sql注入的方式编写。

感谢您的任何见解。

此致

乔恩

3 个答案:

答案 0 :(得分:2)

不,实际查询中没有用户输入,因此没有注入风险。

您必须确保用户无法触发截断,除非他们获得授权。

答案 1 :(得分:1)

确定是否应使用预准备语句不是SQL操作。要防止SQL注入,当查询中涉及允许绑定参数的任何变量时,应使用预准备语句。这不仅限于用户输入,任何变量都应该是绑定的参数,无论它来自何处。

在您的示例中,查询不需要任何变量,因此使用预准备语句没有安全优势。

即使您的table_name来自用户输入或变量,准备好的语句也不是解决方案,因为无法绑定表名。

答案 2 :(得分:1)

准备好的语句对截断查询没有影响。

在使用用户输入运行查询时,PDO预处理语句非常有用,因为它们允许您使用绑定参数等功能来清理用户输入。

它们对于优化多次运行的查询也很有用。

您可能希望在PHP文档中阅读一些准备好的语句 - PHP documentation for prepared statements

  

许多更成熟的数据库支持准备的概念   声明。这些是什么?他们可以被认为是一种   为应用程序想要运行的SQL编译的模板,即   可以使用变量参数进行自定义。准备好的声明提供   两大好处:

     

查询只需要解析(或准备)一次,但也可以   使用相同或不同的参数执行多次。什么时候   准备好查询,数据库将进行分析,编译和优化   它执行查询的计划。对于复杂查询,此过程可以   占用足够的时间会显着减慢应用程序的速度   如果需要多次重复相同的查询   参数。通过使用准备好的声明,应用程序可以避免   重复分析/编译/优化循环。这意味着准备好了   语句使用更少的资源,因此运行得更快。

     

参数   准备好的陈述不需要引用;驱动程序自动   处理这个。如果应用程序专门使用预准备语句,   开发人员可以确保不会发生SQL注入(但是,   如果查询的其他部分是用非转义构建的   输入,SQL注入仍然可行)。准备好的陈述是如此   有用的是,它们是PDO将模仿的唯一功能   不支持他们的司机。这确保了应用程序将   能够使用相同的数据访问范例,无论如何   数据库的功能。