【问题标题】:Can you still get hacked using PDO::quote()?你仍然可以使用 PDO::quote() 被黑客入侵吗?
【发布时间】:2019-02-13 21:57:28
【问题描述】:

检查我的日志时,我注意到使用 PDO::quote() 时不会看到的错误,我读到的 PDO::quote() 可以防止 sql 注入。

error_log 的简短摘录:

[2018 年 9 月 9 日欧洲/巴黎] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '= '' 在 XXXXXXXXXXXXXXX.php:29 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出 [09-Sep-2018 Europe/Paris] PHP 警告:PDO::quote() 期望参数 1 为字符串,数组在第 29 行的 XXXXXXXXXXXXXXX.php 中给出 [09-Sep-2018 Europe/Paris] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 XXXXXXXXXXXXXXX.php:29 的第 1 行的“AND origine > 3 ORDER BY id_client DESC LIMIT 1”附近使用 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出 [09-Sep-2018 Europe/Paris] PHP 警告:PDO::quote() 期望参数 1 为字符串,数组在第 35 行的 XXXXXXXXXXXXXXX.php 中给出 [09-Sep-2018 Europe/Paris] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 XXXXXXXXXXXXXXX.php:38 中的 'LIMIT 1' at line 1' 附近使用正确的语法 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(38): PDO->query('SELECT id_client...') #1 {主要} 在第 38 行的 XXXXXXXXXXXXXXX.php 中抛出 [2018 年 9 月 9 日欧洲/巴黎] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '= '' 在 XXXXXXXXXXXXXXX.php:29 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出 [2018 年 9 月 9 日欧洲/巴黎] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '= '' 在 XXXXXXXXXXXXXXX.php:29 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出 [09-Sep-2018 Europe/Paris] PHP 警告:PDO::quote() 期望参数 1 为字符串,数组在第 29 行的 XXXXXXXXXXXXXXX.php 中给出 [09-Sep-2018 Europe/Paris] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 XXXXXXXXXXXXXXX.php:29 的第 1 行的“AND origine > 3 ORDER BY id_client DESC LIMIT 1”附近使用 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出 [09-Sep-2018 Europe/Paris] PHP 警告:PDO::quote() 期望参数 1 为字符串,数组在第 35 行的 XXXXXXXXXXXXXXX.php 中给出 [09-Sep-2018 Europe/Paris] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 XXXXXXXXXXXXXXX.php:38 中的 'LIMIT 1' at line 1' 附近使用正确的语法 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(38): PDO->query('SELECT id_client...') #1 {主要} 在第 38 行的 XXXXXXXXXXXXXXX.php 中抛出 [2018 年 9 月 9 日欧洲/巴黎] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '= '' 在 XXXXXXXXXXXXXXX.php:29 堆栈跟踪: #0 XXXXXXXXXXXXXXX.php(29): PDO->query('SELECT id_client...') #1 {主要} 在第 29 行的 XXXXXXXXXXXXXXX.php 中抛出

这似乎是带有不安全变量或意外数据的 sql 注入。抛出错误的 PHP/SQL 代码块是:

$email = $_REQUEST['email']; $dataClients = $pdo->query('SELECT id_client, origine FROM clients WHERE email='.$pdo->quote($email).' ORDER BY id_client DESC LIMIT 1')->fetch();

攻击者是否在这里绕过了 $pdo->quote() 的安全使用?使用 $pdo->quote() 不会出现这种错误吗?

【问题讨论】:

  • this
  • 现在,只需将变量绑定到您的查询。让 MySQL 知道变量是什么,并让它们处理所有的引用/转义。

标签: php mysql security pdo


【解决方案1】:

如果您阅读this,您会发现很多鼓励使用准备好的语句而不是 PDO::quote。如果使用正确,PDO::quote 可以帮助您构建安全的 sql 语句,但不能防止问题的发生 - 任何时候您在不绑定所有输入的情况下构建 SQL 语句时,都会冒着忽略攻击可能性的风险。 “束缚,你们将征服!”如果没有看到您的输入,很难真正剖析到底是什么错误。他们似乎是编程错误而不是黑客。例如,您的某些 $_REQUEST 值看起来像是数组,而有些不在默认字符集中 - 这两种情况都会给您带来问题。

也许首先将您的一些输入扔到错误日志中,这样您就可以看到它们为什么会爆炸。比如:

try {
    $email = $_REQUEST['email'];
    $dataClients = $pdo->query('SELECT id_client, origine FROM clients WHERE email='.$pdo->quote($email).' ORDER BY id_client DESC LIMIT 1')->fetch();
} catch (Exception $e) {
    error_log("email requests are: " . var_export($email, true));
    error_log($e->getmessage());
    exit(); // or recover, if you like
}

这仍然不是正确的解决方案,但无论如何您都会更好地处理您的输入。

【讨论】:

  • 这绝对是“一次攻击”,因为输入包含那些自动 sql 注入程序使用暴力破解的值。 我同意准备好的陈述更好。我想知道 PDO::quote 的限制,以及是否只需要一个数组来绕过它并注入 sql,或者它是否只会抛出未捕获的异常。我想知道。
  • PDO 准备好的语句将阻止 SQL 注入攻击,但它们不会阻止垃圾进入您的系统 - 您应该在达到这一点之前进行输入验证。如果 PDO::quote 正在寻找 latin-1 字符集,则不应发送 utf8 或数组。入侵系统的方法有很多——sql 注入只是其中一种讨厌的方法,但归根结底,您必须保护服务器、保持软件最新、检查输入、查看日志等。使用准备好的语句来阻止 sql 注入并继续下一个问题。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2018-04-24
相关资源
最近更新 更多