@andrey69rus

Нашел sql иньекцию. Как закрыть дыру?

ошибка

Ошибка БД

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5, 5' at line 4

SELECT * FROM (`pages`) ORDER BY `id` desc LIMIT -5, 5

Filename: C:\OpenServer\domains\shop\system\database\DB_driver.php

Line Number: 331


код


public function get_bynum($count, $start = 0,$where=FALSE,$single=FALSE) {
$this->db->order_by("id", "desc");
$start = $start*$count;
if($where && is_array($where)) {
$this->db->where_in($where);
$res = $this->db->get($this->table_name,$count,$start,$single);
}
else
$res = $this->db->get($this->table_name,$count,$start,$single);
return $res->result();
}


запрос гет с данными "%40%40J4U6h"
помогите закрыть дырочку)
  • Вопрос задан
  • 535 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Я не вижу здесь инъекции.
Зато я вижу здесь дурацкий квери билдер, в котором, действительно, потенциальных дыр - миллион. Как инъекций, так и логических ошибок.

Плюс нарушение синтаксиса SQL без инъекции.
Чтобы закрыть эту глупость, можешь написать

$start = abs($start);

в методе get() или куда там он дальше передает эти параметры

Но по-хорошему эту проверку надо делать в контроллере, поскольку к SQL она не имеет отношения - это проблема валидности данных. Отрицательные старты надо не исправлять, а показывать для них 404
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
regexp-обработчик!
Ответ написан
Комментировать
@andrey69rus Автор вопроса
нашел решение
if(is_nan($start) == FALSE) $start = 0;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы