2015-08-21 2 views
1

У меня есть этот код на мой контроллер: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
все данные таблицы пользователя:

Array 
(
[0] => stdClass Object 
    (
     [id] => 1 
     [email] => [email protected] 
     [password] => aaa 
    ) 
[1] => stdClass Object 
    (
     [id] => 1 
     [email] => [email protected] 
     [password] => bbb 
    ) 
[2] => stdClass Object 
    (
     [id] => 1 
     [email] => [email protected] 
     [password] => ccc 
    ) 
) 

Возможно ли запустить другой запрос, который возвращает данные из таблицы user_phone?

Таблицы:

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 ('[email protected]','aaa'); 
INSERT INTO `user`(`email`,`password`) VALUES ('[email protected]','bbb'); 
INSERT INTO `user`(`email`,`password`) VALUES ('[email protected]','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'); 

Thks

EDIT:
Я в курсе существующих механизмов для предотвращения этого от Happ Ening.
Мой вопрос в том, возможно ли, и как я могу получить данные из других таблиц.

+1

использовать 'real_escape_string' или что-то подобное, чтобы предотвратить инъекцию. никогда не доверять пользовательскому вводу – SuperDJ

+3

Можете ли вы использовать привязку к параметрам вместо того, чтобы напрямую конкатенировать такие значения? Вы, по сути, выполняете ввод пользователя как код *. – David

+1

вы просите инъекционную строку? Короче говоря, да, можно запустить запрос, который будет выводить данные из всех и всех таблиц/баз данных, к которым имеет доступ текущий пользователь mysql, и многое другое –

ответ

3

Я думаю, что все будет так.

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

Hi volkinc! Он не работает на user.id (Неизвестный столбец «user.id» в «where clause»), но я получаю изображение. Очень много! – random425

0

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(); 
+1

Привет, Джим. Я знаю метод побега. Мой вопрос в том, возможно ли с этим кодом возвращать данные из других таблиц. – random425

0

Вы должны быть в состоянии связать ваш запрос, используя что-то вроде этого:

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

Как для получения данных из других таблиц, вы бы просто нужно построить более сложный запрос SQL

0

Вы спросили о запросе данных из 2 таблиц, чтобы запросить 2 связанные таблицы, которые вы можете использовать для соединения. В вашем примере используются пользователь и user_phone. Вы выполняете sql-запросы с объединением, как показано ниже. Пользователь primary_key - это клей в таблице user_phone. 1 - выберите * 2 - передать идентификатор, который мы хотим получить 3 - из какой таблицы 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(); 
+1

Можете ли вы объяснить свой ответ? Ответ гораздо полезнее, если он объясняет, что делается, чтобы его методы могли применяться к другим ситуациям. –

+2

Право, я был в спешке, я добавил информацию, чтобы объяснить, что делает заявление и как это делается. Спасибо, что указали на это, хотя :). – mdamia

+1

Привет, mdamia. Ты ответишь. В основном, мой вопрос заключался в том, как объединить таблицы, используя ** SQL Injection **, не используя код. – random425