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 专家,所以我可能遗漏了一些明显的东西。
编辑:
让我列出我有点担心接受此代码易受攻击的原因。
OpenCart (https://github.com/opencart/opencart) 是一个流行的开源项目,有 200 多个分支。
它专门用于购物车(电子商务)解决方案,因此开发人员会考虑安全性,sql 像这样的注入是他们首先要做的事情之一会检查的。
看起来确实使用 $this->db->escape($data['telephone'])
进行了某种转义
由于所有内容都被转义或转换为整数,我会说它不易受到 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
我一直在研究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 专家,所以我可能遗漏了一些明显的东西。
编辑:
让我列出我有点担心接受此代码易受攻击的原因。
OpenCart (https://github.com/opencart/opencart) 是一个流行的开源项目,有 200 多个分支。
它专门用于购物车(电子商务)解决方案,因此开发人员会考虑安全性,sql 像这样的注入是他们首先要做的事情之一会检查的。
看起来确实使用
$this->db->escape($data['telephone'])
进行了某种转义
由于所有内容都被转义或转换为整数,我会说它不易受到 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