PHP SQL 注射可能性

PHP SQL Injection Possibility

我一直在研究opencart,它写在PHP。

如果您查看以下 php 文件,

https://github.com/opencart/opencart/blob/master/upload/admin/model/customer/customer.php

SQL 语句如下所示

$this->db->query("INSERT INTO " . DB_PREFIX . "customer 
SET customer_group_id = '" . (int)$data['customer_group_id'] . "', 
firstname = '" . $this->db->escape($data['firstname']) . "', 
lastname = '" . $this->db->escape($data['lastname']) . "', 
email = '" . $this->db->escape($data['email']) . "', 
telephone = '" . $this->db->escape($data['telephone']) . "', 
custom_field = '" . $this->db->escape(isset($data['custom_field']) ? json_encode($data['custom_field']) : json_encode(array())) . "', 
newsletter = '" . (int)$data['newsletter'] . "', 
salt = '', 
password = '" . $this->db->escape(password_hash($data['password'], PASSWORD_DEFAULT)) . "', 
status = '" . (int)$data['status'] . "', 
safe = '" . (int)$data['safe'] . "', 
date_added = NOW()");

避免 PHP sql 注入的推荐方法是使用准备好的语句。

我的问题是考虑这个特定代码如何不使用准备好的语句,这个代码是否容易受到 sql 注入的攻击?

我不是 php 专家,所以我可能遗漏了一些明显的东西。

编辑:

让我列出我有点担心接受此代码易受攻击的原因。

  1. OpenCart (https://github.com/opencart/opencart) 是一个流行的开源项目,有 200 多个分支。

  2. 它专门用于购物车(电子商务)解决方案,因此开发人员会考虑安全性,sql 像这样的注入是他们首先要做的事情之一会检查的。

  3. 看起来确实使用 $this->db->escape($data['telephone'])

  4. 进行了某种转义

由于所有内容都被转义或转换为整数,我会说它不易受到 SQL 注入的影响。

当然,Qirel 在评论中是正确的,使用准备好的语句在所有可以想象的方面都是更好的解决方案。更难阅读,以后修改代码时很容易被错误攻击。

编辑: 经过一些研究,似乎只有在数据库字符集设置正确的情况下,这才是正确的。否则,它可能仍然容易受到多字节攻击。

如果在服务器级别设置了不正确的字符集,OpenCart 在使用 MySQL 时似乎容易受到攻击,因为它使用 SET CHARACTER SET 查询而不是 PHP 手册中的 mysql_real_escape_string. You can see it in latest v3.0.2.0 on Github. For details see MySQL Character sets .

我在 !5812 中建议解决此特定问题。

您可以预见某些类型的 sql 注入 htmlspecialchars 但不是全部。通常正确的方法是使用 PHP 数据的数据库对象或 CRM / Frameworks 对象的自身资源。

查看以下链接: http://php.net/manual/pt_BR/pdo.prepare.php https://www.doctrine-project.org/projects/doctrine-dbal/en/2.7/reference/data-retrieval-and-manipulation.html https://framework.zend.com/manual/2.4/en/modules/zend.db.sql.html