【发布时间】:2017-07-28 16:22:51
【问题描述】:
我一直在研究用 PHP 编写的 opencart。
如果你看看下面的 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 专家,所以我可能在这里遗漏了一些明显的东西。
编辑:
让我列出我有点担心接受此代码易受攻击的原因。
OpenCart (https://github.com/opencart/opencart) 是一个流行的开源项目,拥有超过 200 个分支。
它专门用于购物车(电子商务)解决方案,因此开发人员会考虑安全性,并且像这样的 sql 注入是他们首先要检查的事情之一。
看起来确实是使用
$this->db->escape($data['telephone'])完成了某种转义
【问题讨论】:
-
是的,这段代码很容易受到攻击,因为它没有使用Prepared Statements,转义字符串不再是推荐的 SQL 注入解决方案,而且还不够
-
防止 SQL 注入的唯一确定方法是使用预准备语句。这在许多其他方面也更好 - 避免转义,只需使用准备好的语句。
-
这不是重复的,请阅读编辑。我知道避免 SQL 注入的推荐方法。但这不是那个。
-
$this->db->escape(isset($data['custom_field']) ? json_encode($data['custom_field']) : json_encode(array()))读起来很可怕。有关您的具体问题,请参阅security.stackexchange.com/questions/3611/…。Always using prepared statements with parameters is something that can be validated by static code analysis tools. A missing call to xxx_escape_string is not spotted that easily and reliably.如果未来的开发人员将其更改为safe = '(int)" . $data['safe'] . ",那么您是开放的。
标签: php opencart sql-injection opencart-module opencart2.3