我一直在研究用 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'])