это уязвимость codeigniter?

Я обнаружил ошибку в своем скрипте разбивки на страницы в CodeIgniter:

 $this->db->where("by_id",$user_id);
 $this->db->order_by("date","desc");
 $this->db->limit(10,$from);
 $query = $this->db->get("status");

URL-адрес выглядит следующим образом: server/demo/page/10.

так что если тип пользователя server/nedjma/baniss/10000000000000000000000

Номер ошибки: 1064

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «10000000000000000000000, 10» в строке 5.

SELECT * FROM (status) WHERE by_id = '58' ORDER BY date desc LIMIT 10000000000000000000000, 10

подскажите пожалуйста в чем ошибка?


person aniss.bouraba    schedule 17.09.2009    source источник
comment
Извините, приятель, просто удалил ссылку на этот сайт, поскольку он был открыт для SQL-инъекций. Кто-то еще ответит подробно (я недостаточно знаю о php), но вам нужно проверить переменную '$ from', чтобы убедиться, что это число только.   -  person Noon Silk    schedule 17.09.2009
comment
@silky, проверка переменной from является допустимым ответом на всех языках, а не только на PHP.   -  person Vineet Reynolds    schedule 17.09.2009
comment
Vineet: Да, я просто не знаю, как подтвердить, что это int в php; сумасшедшие нетипизированные языки :P   -  person Noon Silk    schedule 17.09.2009
comment
@silky, активная запись CodeIgniter ($this-›db) автоматически проверяет, что $from является только числом.   -  person jimyi    schedule 17.09.2009
comment
@jimyi, посещение /page/23/home/1beefcake1 приводит к ... ORDER BY cf_pages.pages_sort asc LIMIT 1beefcake1, 3.   -  person sisve    schedule 17.09.2009


Ответы (1)


Это не уязвимость или ошибка CodeIgniter. Это просто проблема SQL/MySQL. Я провел небольшое тестирование с помощью phpMyAdmin, самое большое смещение, которое вы можете использовать, составляет где-то около 180000000000000000000.

Что-нибудь больше, и вы получите синтаксическую ошибку SQL. Если вы хотите предотвратить появление этой ошибки, просто убедитесь, что $from не превышает 18 x 10^18, или создайте свои собственные страницы ошибок. Вы также можете просто отключить отчеты об ошибках — в верхней части CI index.php, error_reporting(0);

И последнее замечание: опубликованный вами код не открыт для SQL-инъекций. Класс CodeIgniter Active Record ускользает и проверяет ваш ввод. Если $from не является числом, Active Record не будет генерировать предложение LIMIT при создании SQL.

person jimyi    schedule 17.09.2009
comment
Я согласен, это допустимое число, просто слишком большое для mysql, сделайте проверку на максимум, и это должно быть устранено. - person Jakub; 17.09.2009