当前位置: 首页 > 知识库问答 >
问题:

转义pdo查询,这是必要的吗?

许俊晤
2023-03-14

我今天的问题是。我需要在我的脚本中转义PDO吗?

$columns = implode(", ",$column);
$query = ''.$query.' '.$columns.' FROM '.$table.'';
$dbh_query = $dbh->prepare($query);
$dbh_query->execute();
$dbh_querys = $dbh_query->fetchAll();

return $dbh_querys;

整个脚本可在中找到。https://github.com/joshuahiwat/crud/blob/master/control/query_connector.class.php

有人能解释一下为什么我现在需要逃跑,或者为什么不需要。

我很想收到你的来信,非常感谢!

共有2个答案

祁辰阳
2023-03-14

首先,你需要明白,你所使用的“逃避”这个词是没有意义的。

您可能的意思是“使您的查询不受SQL注入的影响”。但是,不幸的是,没有这样神奇的“转义”可以让一些抽象查询变得安全

传统的查询构建假定数据值旁边的所有查询部分都是硬编码的,而数据值是通过占位符绑定的,如下所示:

$query = 'SELECT col1, col2 FROM some_table WHERE id = ?';
$stmt = $dbh->prepare($query);
$stmt->execute([$id]);
$row = $stmt->fetch();

这种查询被认为是安全的。

对于动态构造的查询,每个部分都有潜在的漏洞。

在这里,非常重要的是要理解清理所有查询部分的负担完全在这个功能上。您不能简单地声称您的数据来自受信任的来源就排除了危险。这是一个棘手的问题,因为人们通常不知道他们的来源是否受信任。

因此,如果将您的问题理解为“我是否必须保护此代码不受SQL注入的影响”,那么答案是-是的,您必须这样做。

与此同时,您只保护查询的一小部分——数据值。所以您仍然必须保护(这个术语比“转义”好得多)所有其他部分。

另一方面,您的代码每次运行查询时都会连接到数据库,这非常低效,并且无法使用某些数据库功能

巢宏富
2023-03-14

查询的动态部分是表名和列名。不能对查询的这些部分使用绑定函数。绑定函数只能用于SQL查询中原本是简单值的查询部分。例如数字常量、带引号的字符串或带引号的日期文字。

为了避免动态表名或列名SQL注入,您可以选择以下选项:

  • 使用在类中预定义的值,或其他确保安全的值。不要使用来自用户或任何其他来源的外部内容
 类似资料:
  • 问题内容: 在PDO :: Prepare页上指出: “并且通过消除对参数的手动引用来帮助防止SQL注入攻击” 知道这一点,是否有一个像mysql_real_escape_string()这样的PHP函数可以照顾到PDO的转义?还是PDO会为我做好一切转义? 编辑 我现在意识到我问了一个错误的问题。我的问题确实是,“ PDO会为我做什么?” 我现在通过这些答案意识到,它实际上仅消除了对引号进行转义

  • 在我的工作中,传统的做法是不安全地将参数连接到查询字符串中来形成SQL查询。当然,这会导致SQL注入漏洞。这并不被认为是一个大问题,因为发生这种情况的所有Java软件都运行在封闭的网络上,所有用户都被认为是可信的。此外,查询是从具有数据库访问权限的客户端应用程序执行的,因此从技术上讲,用户无论如何都可以执行恶意查询。 尽管如此,它计划在数据库层的新版本中支持准备好的语句。同时,我在现有的数据库层上

  • 问题内容: 有人告诉我,最好使用MySQL转义,而不是。 也许我真是个脑筋急转弯的一天(或者可能是我天生没有想象力的天才程序员,而我在PHP方面仍然处于新手阶段),但是查阅了PHP手册并阅读了PDO上的条目,我仍然不清楚PDO到底是什么以及为什么它比使用PDO更好。这可能是因为我还没有真正掌握OOP的复杂性(我认为这与OOP有关),但是除了变量和数组值似乎在它们前面有一个冒号之外,我仍然不确定它到

  • 问题内容: 我正在使用 spring / hibernate / mysql ,目前在 spring-hibernate.xml中 使用以下设置 我经常看到 “ select @@ session.tx_read_only” 和 “ select @@ session.tx_isolation” 查询主要在选择实际数据的语句之后发送到数据库。 这些查询中的每一个都会增加20-25毫秒的时间,而在O

  • 问题内容: 从PHP 5.3版开始,已对驱动程序进行了补充。它引入了对多个查询的支持。 但是,如果传递了多个查询,我无法弄清楚如何获得两个结果集。这两个查询都已执行,不可能是第二个查询刚刚被转储。 返回值: 问题答案: 原来,您需要使用。 这将返回第二个查询的结果。 这是一个有点奇怪的实现。如果多查询语句仅将两个结果集返回在一个数组下,那肯定会更容易。但是,优点是此实现允许使用不同的FETCH样式

  • 问题内容: 他们俩都做同一件事,只是做事不同吗? 除了使用之间还有什么区别 和 ? 问题答案: 运行标准SQL语句,并要求您正确转义所有数据,以避免SQL注入和其他问题。 运行一个准备好的语句,该语句使您可以绑定参数,以避免需要转义或引用参数。如果您多次重复查询,效果也会更好。准备语句的示例: 最佳实践是坚持准备好的语句并提高安全性。