你仍然可以使用PDO::quote()被黑客攻击吗



在检查日志时,我注意到在使用PDO::quote()时出现的错误。

error_log的简短摘录:

[2018年9月9日欧洲/巴黎]PHP致命错误:未捕获异常"PDOException",消息为"SQLSTATE[HY000]":一般错误:1267 XXXXXXXXXXXXXXXX中操作"="的排序规则(latin_swedish_ci,IMPLICIT)和(utf8_General_ci,COERCIBLE)非法混合。PHP:29堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中引发〔09-Sep-2018欧洲/巴黎〕PHP警告:PDO::quote()期望参数1为字符串,数组在XXXXXXXXXXXXX.PHP第29行给出〔09-Sep-2018欧洲/巴黎〕PHP致命错误:未捕获异常'PDOException',消息为'SQLSTATE[42000]:语法错误或访问违规:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获得在XXXXXXXXXXXXX.php:29中第1'行的"AND origine>3 ORDER BY id_client DESC LIMIT 1'"附近使用的正确语法堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中引发〔09-Sep-2018欧洲/巴黎〕PHP警告:PDO::quote()期望参数1为字符串,数组在XXXXXXXXXXXXX.PHP第35行给出〔09-Sep-2018欧洲/巴黎〕PHP致命错误:未捕获异常'PDOException',消息为'SQLSTATE[42000]:语法错误或访问违规:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获得在XXXXXXXXXXXXXX.php中第1'行的LIMIT 1'附近使用的正确语法:38堆栈跟踪:#0 XXXXXXXXXXXXXX.php(38):PDO->查询('SELECT id_clien…')#1{main}在第38行的XXXXXXXXXXXXX.php中引发〔2018年9月9日欧洲/巴黎〕PHP致命错误:未捕获异常"PDOException",消息为"SQLSTATE[HY000]":一般错误:1267 XXXXXXXXXXXXXXXX中操作"="的排序规则(latin_swedish_ci,IMPLICIT)和(utf8_General_ci,COERCIBLE)非法混合。PHP:29堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中引发〔2018年9月9日欧洲/巴黎〕PHP致命错误:未捕获异常"PDOException",消息为"SQLSTATE[HY000]":一般错误:1267 XXXXXXXXXXXXXXXX中操作"="的排序规则(latin_swedish_ci,IMPLICIT)和(utf8_General_ci,COERCIBLE)非法混合。PHP:29堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中引发〔09-Sep-2018欧洲/巴黎〕PHP警告:PDO::quote()期望参数1为字符串,数组在XXXXXXXXXXXXX.PHP第29行给出〔09-Sep-2018欧洲/巴黎〕PHP致命错误:未捕获异常'PDOException',消息为'SQLSTATE[42000]:语法错误或访问违规:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获得在XXXXXXXXXXXXX.php:29中第1'行的"AND origine>3 ORDER BY id_client DESC LIMIT 1'"附近使用的正确语法堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中引发〔09-Sep-2018欧洲/巴黎〕PHP警告:PDO::quote()期望参数1为字符串,数组在XXXXXXXXXXXXX.PHP第35行给出〔09-Sep-2018欧洲/巴黎〕PHP致命错误:未捕获异常'PDOException',消息为'SQLSTATE[42000]:语法错误或访问违规:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获得在XXXXXXXXXXXXXX.php中第1'行的LIMIT 1'附近使用的正确语法:38堆栈跟踪:#0 XXXXXXXXXXXXXX.php(38):PDO->查询('SELECT id_clien…')#1{main}在第38行的XXXXXXXXXXXXX.php中引发〔2018年9月9日欧洲/巴黎〕PHP致命错误:未捕获异常"PDOException",消息为"SQLSTATE[HY000]":一般错误:1267 XXXXXXXXXXXXXXXX中操作"="的排序规则(latin_swedish_ci,IMPLICIT)和(utf8_General_ci,COERCIBLE)非法混合。PHP:29堆栈跟踪:#0 XXXXXXXXXXXXXX.php(29):PDO->查询('SELECT id_clien…')#1{main}在第29行的XXXXXXXXXXXXX.php中抛出

这看起来像是使用不安全变量或意外数据的sql注入。抛出错误的PHP/SQL代码块是:

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

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

如果你读过这篇文章,你会发现很多人鼓励你使用事先准备好的语句,而不是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
}

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

相关内容

  • 没有找到相关文章

最新更新