Codeigniter SQL 注入

Codeigniter SQL Injection

我的控制器上有这个代码:

$sql = "SELECT * FROM user WHERE id = " . $this->input->get('foo'); 
$foo = $this->db->query($sql);
echo '<pre>';
print_r($foo->result());
echo '</pre>';
die();

我注意到如果我使用这个 URL:
www.site.com?foo=1 或 1 = 1
显示用户 table 的所有数据:

Array
(
[0] => stdClass Object
    (
        [id] => 1
        [email] => aaa@gmail.com
        [password] => aaa
    )
[1] => stdClass Object
    (
        [id] => 1
        [email] => bbb@gmail.com
        [password] => bbb
    )
[2] => stdClass Object
    (
        [id] => 1
        [email] => ccc@gmail.com
        [password] => ccc
    )
)

是否可以 运行 另一个查询 returns 来自 user_phone table 的数据?

表格:

CREATE TABLE `user` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(100) NOT NULL,
  `password` VARCHAR(255) NOT NULL
  PRIMARY KEY (`id`),
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


CREATE TABLE `user_phone` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_user` INT(11) UNSIGNED NOT NULL,
  `number` INT(11) UNSIGNED NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

数据:

INSERT  INTO `user`(`email`,`password`) VALUES ('aaa@gmail.com','aaa');
INSERT  INTO `user`(`email`,`password`) VALUES ('bbb@gmail.com','bbb');
INSERT  INTO `user`(`email`,`password`) VALUES ('ccc@gmail.com','ccc');

INSERT  INTO `user_phone`(`id_user`,`number`) VALUES ('1','911911911');
INSERT  INTO `user_phone`(`id_user`,`number`) VALUES ('1','922922922');
INSERT  INTO `user_phone`(`id_user`,`number`) VALUES ('2','955955955');
INSERT  INTO `user_phone`(`id_user`,`number`) VALUES ('3','711711711');

感谢

编辑:
我知道防止这种情况发生的现有机制。
我的问题是是否可能以及如何从其他 tables.

获取数据

CI 正是出于这个原因而带有转义变量的函数。

$foo = $this->input->get('foo');
$foo = $this->db->escape($foo);
$sql = "SELECT * FROM user WHERE id = {$foo}"; 
$foo = $this->db->query($sql);
echo '<pre>';
print_r($foo->result());
echo '</pre>';
die();

我觉得会是这样。

www.site.com?foo=1 OR 1 = 1 union select * from user_phone where user_phone.id_user = user.id

您应该能够使用类似这样的方式绑定您的查询:

$sql = "SELECT * FROM user WHERE id = ? AND name = ?"; 
$foo = $this->db->query($sql, array('foo', 'bar'));

至于从其他表获取数据,你只需要构造一个更精细的sql查询

您询问了关于查询来自 2 tables 的数据,要查询 2 个相关的 tables 您可以使用 join。在您的示例中,用户和 user_phone 是相关的。您使用连接执行 sql 查询,如下面的演示。用户 primary_key 是 user_phone table 中的粘合剂。 1 - select * 2 - 传递我们要检索的 id 3 - 来自 table 4 - 执行连接或多个连接 5 - 得到结果 试试这个

$this -> db -> select('*');
$this -> db -> where('id' => '1');
$this -> db -> from('user');
$this -> db -> join('user_phone', 'user_phone.id_user = user.id');
$query = $this -> db -> get();