php pdo 绕过,关于php:逃避pdo查询,是否有必要?

我今天的问题是。 我需要在脚本中转义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

有人可以解释为什么我现在需要逃跑或为什么不。

我很想听到你的消息,非常感谢!

phpdelusions.net/pdo/sql_injection_example

您应该转义任何不受信任的数据。 $foo ="bar";可以信任,因为你是设置它的人(并且它不能被覆盖)。 $_GET['foo']可以是任何东西,所以不要相信它!我逃避不受信任的数据,而不是一切。

stackoverflow.com/questions/3716373/real-escape-string-and-pdo

感谢您的评论,但我是否需要逃离这里,或者因为PDO大部分时间都在关注这些问题。

PDO唯一自动处理的是使用bindParam/bindValue填充的预处理语句参数。

它不会对查询的其余部分进行任何更改。

"因为PDO大部分时间都在关心这些问题。" ---你最好不要那样对待它。 PDO只是一种工具。它不会使任何东西自动安全。您仍然必须了解应该如何以及应该做什么。

所以我需要在excute之前创建一个bindparam来逃避?

您需要阅读我提到的文章并首先了解威胁。

@zerkms非常感谢!

@zerkms我已经测试了你保护的方式,但是在我的脚本中是不可能的,因为我不能决定系统会想到的关键,它是,它是我们的动态。当我测试注入我的脚本时,它只返回一个数组错误而没有结果。所以我想我只能用bindparam逃脱那件事?

每当您在查询中放置某些内容时,必须根据可接受值的白名单对其进行转义或验证。没有例外。

您对我们的期望是什么?您来到这里询问如何保护您的查询。现在你说你不能/不想做你被告知的事情。那么你期待什么?我们会说,"好吧,不要这样做,你是安全的"?我们不会。当然,它不适用于开箱即用的代码,每次注入攻击必须专门伪造。但注射仍然存在。

@YourCommonSense我正在寻找正确的答案,每个答案都很好,但没有任何示例我需要如何获得保护或我需要保护的代码的哪一部分。有人说绑定,但其他人说执行。

@PieterDijkstra绑定结束执行完全相同。但是你的问题与他们都没有关系。大多数查询都不能通过bind not execute来保护

查询中的动态部分是表名和列名。您不能对查询的这些部分使用绑定函数。绑定函数只能用于查询的部分,否则它们将成为SQL查询中的简单值。像数字常量,或带引号的字符串或引用日期文字。

要避免从动态表名或列名注入SQL,您有以下选择:

使用您班级中预定义的值,或者确定安全的值。请勿使用用户或任何其他来源的外部内容。

使用转义。请注意,函数PDO::quote()不会执行表名或列名所需的转义。

创建已知表名的"白名单"和相应表的列名,并将动态输入与白名单进行比较。如果它与白名单不匹配,则引发错误。

首先,你需要明白你所使用的词 -"逃避" - 是毫无意义的。

您可能的意思是"使您的查询免受SQL注入"。但是,不幸的是,没有这样的魔术"逃避"会使一些抽象的查询安全。

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

$query = 'SELECT col1, col2 FROM some_table WHERE id = ?';

$stmt = $dbh->prepare($query);

$stmt->execute([$id]);

$row = $stmt->fetch();

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

对于动态构造的查询,每个部分都可能存在漏洞。

在这里,了解清除所有查询部分的负担完全取决于此功能,这一点非常重要。您不能仅仅因为声称您的数据来自可靠来源而忽略了危险。这是一个滑点,因为人们通常不知道他们的来源是否可信。

因此,如果将您的问题称为"我是否必须保护此代码免受SQL注入",那么答案是 - 是的,您有。

与此同时,您只保护查询的一小部分 - 数据值。所以你仍然需要保护(这个术语比"逃避"更好)所有其他部分。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值