【问题标题】:SQL Query as a string - safe from injection? [duplicate]SQL 查询作为字符串 - 安全注入? [复制]
【发布时间】:2018-05-02 12:19:28
【问题描述】:

大部分时间我都在做这样的 SQL:

$pdo = new PDO($dsn, $usr, $pass);

$qry = 'SELECT * FROM `my_table` WHERE `pk_id` = '. $id .';';
$res = $pdo->query($qry);

但最近我看到一些帖子表明,确保安全的唯一方法是使用准备好的语句 - 这对我来说真的不是问题,这可能有一个答案,只是我无法从谷歌搜索。

当然,如果我的所有语句都以 .';' 结尾,使用 concat 可以吗?

谢谢,

【问题讨论】:

  • @baao 我说它不是重复的唯一论据是因为我使用连接而不是在字符串中传递变量或在某些地方使用?
  • 除了在字符串中传递变量还有什么pk_id = '. $id .';?
  • 唯一确定的安全方法是使用准备好的语句。其他任何事情都是不专业的,并且忽略了您的应用程序的安全性。
  • 如果我可以举个例子,那就是我可以使用$id = " 00 OR 1 = 1"访问您的数据,这将导致SELECT * FROM my_table WHERE pk_id = 00 OR 1 = 1 ;
  • 如果是出于教育目的,让我举个例子。如果您要转义所有输入,您可能会考虑在散列密码之前也使用密码。这可能会更改哈希值,并且密码可能会有所不同。使用准备好的语句可以避免这种情况,因为不会以任何方式更改数据(转义会更改数据以使其“安全”插入)。准备好的语句发送两个请求;一个用于查询,一个用于值 - 因此在发送之前不会更改任何数据。

标签: php mysql pdo prepared-statement


【解决方案1】:

没有。

在 SQL 中,如果您在查询末尾提供两个分号,则不会出错。

所以如果用户可以传递这个:

1; DROP TABLE users;

无论是否在代码末尾添加分号,都会产生相同的结果。

准备好的语句的巨大好处是不会更改任何数据。它只是简单地发送两个查询。

Here 是一个不错的来源,其中包含大量 SQL 注入示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2021-11-29
    • 2022-06-11
    • 2013-03-07
    相关资源
    最近更新 更多