Php 代码点火器SQL注入

Php 代码点火器SQL注入,php,mysql,codeigniter,sql-injection,Php,Mysql,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(); 是否可以运行另一个查询,从user_phone表返回数据 表格: INSERT INTO `u

我的控制器上有以下代码:

$sql = "SELECT * FROM user WHERE id = " . $this->input->get('foo'); 
$foo = $this->db->query($sql);
echo '<pre>';
print_r($foo->result());
echo '</pre>';
die();
是否可以运行另一个查询,从user_phone表返回数据

表格:

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');
$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();
数据:

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');
$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();
Thks

编辑:
我知道防止这种情况发生的现有机制。

我的问题是,是否有可能,以及如何从其他表中获取数据。

CI提供了函数来转义变量,正是出于这个原因

www.site.com?foo=1 OR 1 = 1 union select * from user_phone where user_phone.id_user = user.id
$foo=$this->input->get('foo');
$foo=$this->db->escape($foo);
$sql=“从用户中选择*,其中id={$foo}”;
$foo=$this->db->query($sql);
回声';
打印($foo->result());
回声';
模具();

我想会是这样的

$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查询,查询两个表中的数据,查询两个可以使用join的相关表。在您的示例中,用户和用户电话是相关的。您可以像下面的演示一样使用join执行sql查询。用户主键是用户电话表中的胶水。 1-选择* 2-传递我们要检索的id 3-从哪个表 4-执行一个联接或多个联接 5-得到结果 试试这个


使用
real\u escape\u string
或类似的方法来防止注入。永远不要信任用户输入您可以使用参数绑定而不是像那样直接连接值吗?实际上,您正在以代码的形式执行用户输入。是否要求输入字符串?简而言之,是的,可以运行一个查询,该查询将从当前mysql用户可以访问的任何和所有表/数据库中输出数据!谢谢你的回复。我知道可以防止这种情况发生的功能/方法。我的问题是,是否有可能使用此代码从其他表返回数据。太棒了!您想要表格用户和用户电话的数据吗?嗨,Jim。我知道逃跑的方法。我的问题是,这段代码是否有可能从其他表返回数据。嗨,volkinc!它在user.id上失败(“where子句”中的未知列“user.id”),但我明白了。太多了!你能解释一下你的答案吗?如果一个答案解释了正在做的事情,这样它的技术就可以应用于其他情况,那么它就更有用了。对,我当时有点匆忙,我添加了一些信息来解释这个陈述是做什么的,以及它是如何做的。谢谢你指出这一点:)。你好,阿米亚。谢谢你的答复。基本上,我的问题是如何使用SQL注入连接表,而不是使用代码。
$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();