我在当前项目中使用了以下几种代码来清除一些表格。如果我不熟悉我使用PDO。
$clearResult = $db->query('TRUNCATE TABLE table_name');
我目前正在浏览并更新我之前的一些脚本,以确保它们都使用预处理语句,并以减少(希望停止)sql注入的方式编写。
感谢您的任何见解。
此致
乔恩
答案 0 :(得分:2)
不,实际查询中没有用户输入,因此没有注入风险。
您必须确保用户无法触发截断,除非他们获得授权。
答案 1 :(得分:1)
确定是否应使用预准备语句不是SQL操作。要防止SQL注入,当查询中涉及允许绑定参数的任何变量时,应使用预准备语句。这不仅限于用户输入,任何变量都应该是绑定的参数,无论它来自何处。
在您的示例中,查询不需要任何变量,因此使用预准备语句没有安全优势。
即使您的table_name
来自用户输入或变量,准备好的语句也不是解决方案,因为无法绑定表名。
答案 2 :(得分:1)
准备好的语句对截断查询没有影响。
在使用用户输入运行查询时,PDO预处理语句非常有用,因为它们允许您使用绑定参数等功能来清理用户输入。
它们对于优化多次运行的查询也很有用。
您可能希望在PHP文档中阅读一些准备好的语句 - PHP documentation for prepared statements:
许多更成熟的数据库支持准备的概念 声明。这些是什么?他们可以被认为是一种 为应用程序想要运行的SQL编译的模板,即 可以使用变量参数进行自定义。准备好的声明提供 两大好处:
查询只需要解析(或准备)一次,但也可以 使用相同或不同的参数执行多次。什么时候 准备好查询,数据库将进行分析,编译和优化 它执行查询的计划。对于复杂查询,此过程可以 占用足够的时间会显着减慢应用程序的速度 如果需要多次重复相同的查询 参数。通过使用准备好的声明,应用程序可以避免 重复分析/编译/优化循环。这意味着准备好了 语句使用更少的资源,因此运行得更快。
参数 准备好的陈述不需要引用;驱动程序自动 处理这个。如果应用程序专门使用预准备语句, 开发人员可以确保不会发生SQL注入(但是, 如果查询的其他部分是用非转义构建的 输入,SQL注入仍然可行)。准备好的陈述是如此 有用的是,它们是PDO将模仿的唯一功能 不支持他们的司机。这确保了应用程序将 能够使用相同的数据访问范例,无论如何 数据库的功能。