【发布时间】: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 知道变量是什么,并让它们处理所有的引用/转义。