2014-04-09 38 views
0

我在当前项目中使用了几次以下类型的代码来清除一些表。因为我不明白我正在使用PDO。不使用准备好的语句截断表是否安全?

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

我目前经历和更新一些我以前的剧本,以确保他们都充分利用准备好的发言和写的方式来减少(希望停止)SQL注入。

感谢您的任何见解。

问候

乔恩

+3

您不必使用预处理语句,因为没有用户输入。 –

+3

准备好的语句适用于需要多次使用不同参数运行相同的基本查询,或需要使用placehodlers插入动态数据或需要绑定变量以获得结果的情况。你不会用不同的参数多次运行这个查询,没有外部数据要粘贴到查询中,也没有返回的数据。所以......不,你不需要准备好的声明。 –

+0

太棒了......非常感谢大家......如果我能打勾你们所有的答案,我会......欢呼乔恩。感谢您澄清准备好的陈述以及答案。我的代码和未来的代码对它来说都是更好的...现在爱上PHP很多,现在3个月后... – Parzival

回答

2

没有,有在实际查询没有用户输入的,所以没有注射的风险。

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

1

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

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

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

+0

请解释downvote。 – MrCode

1

准备好的语句对截断查询不起作用。

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

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

你可能需要阅读了关于PHP文档准备语句中一点点 - PHP documentation for prepared statements

很多更成熟的数据库都支持准备 语句的概念。他们是什么?它们可以被认为是应用程序想要运行的SQL的编译模板 ,可以使用可变参数来定制 。准备报表提供 两大好处:

该查询只需要解析(或准备)一次,但可以使用相同或不同的参数多次执行 。当 准备好查询时,数据库将分析,编译并优化其执行查询的计划。对于复杂的查询,如果需要用不同的 参数多次重复相同的查询,则该过程可能会花费足够的时间,以致明显地减慢应用程序的速度 。通过使用准备好的语句,该应用程序避免了重复分析/编译/优化循环的 。这意味着准备好的 语句使用更少的资源,从而运行得更快。

参数 准备语句不需要引用;驱动程序自动 处理这一点。如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分正在使用未转义的 输入构建,则仍然可以执行SQL注入),但是 。编写的语句如此 非常有用,它们是PDO将为不支持它们的 驱动程序模拟的唯一功能。这确保了应用程序将能够使用相同的数据访问范例,而不管数据库的 功能如何。