0

我一直在研究用 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 专家,所以我可能在这里遗漏了一些明显的东西。

编辑:

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

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

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

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

4

2 回答 2

1

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

当然,Qirel 在评论中是正确的,即在所有可以想象的方式中,使用准备好的语句是一个更好的解决方案。它更难阅读,并且在将来修改代码时很容易被错误地攻击。

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

如果在服务器级别设置了不正确的字符集,OpenCart 在使用 MySQL 时似乎很容易受到攻击,因为它使用SET CHARACTER SET查询而不是mysql_real_escape_string. 你可以在 Github 上的最新 v3.0.2.0中看到它。有关详细信息,请参阅PHP 手册中的MySQL 字符集

我在!5812中建议修复此特定问题。

于 2017-07-28T17:09:32.693 回答
0

您可以预见某些类型的带有 htmlspecialchars 的 sql 注入,但不是全部。通常正确的一种是使用 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

于 2018-06-05T21:40:51.903 回答