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

问题描述 投票:0回答:3

我在当前项目中多次使用以下代码来清除一些表。如果不太明显,我正在使用PDO。

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

我目前正在检查和更新一些较早的脚本,以确保它们都使用了准备好的语句,并且以减少(希望停止)sql注入的方式编写。

php pdo sql-injection truncate
3个回答
2
投票

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

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


1
投票

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

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

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


1
投票

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

PDO准备好的语句在运行带有用户输入的查询时很有用,因为它们允许您使用诸如绑定参数之类的功能来清理用户输入。

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

您可能想阅读PHP文档中的准备好的语句-PHP documentation for prepared statements

[许多较成熟的数据库支持准备的概念陈述。这些是什么?他们可以被认为是一种应用程序要运行的SQL的已编译模板,可以使用可变参数进行自定义。预备帐单报价两个主要好处:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.