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();
我的控制器上有这个代码:
$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();