как codeigniter очищает входные данные?


Я создаю приложение Codeigniter и изо всех сил стараюсь предотвратить SQL-инъекции. Я использую метод активной записи для построения всех своих запросов. Я знаю, что активная запись автоматически очищает входные данные, но мне интересно, до какой степени? Он просто избегает всех цитат или делает больше? Как насчет предотвращения запутанных SQL-инъекций или других более продвинутых видов?

В принципе, я ищу подробное объяснение того, как CI очищает данные. Кто-нибудь знает?

Author: tereško, 2011-11-05

3 answers

Точно так же (для драйвера MySQL):

  • Пытается mysql_real_escape_string() (это будет иметь место в 99% случаев)
  • Возвращается к mysql_escape_string()
  • Возвращается к addslashes()
  • Вручную экранирует % и _ в условиях LIKE через str_replace()

Https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294

/**
* Escape String
*
* @access public
* @param string
* @param bool whether or not the string will be used in a LIKE condition
* @return string
*/
function escape_str($str, $like = FALSE)
{
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = $this->escape_str($val, $like);
        }

        return $str;
    }

    if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
    {
        $str = mysql_real_escape_string($str, $this->conn_id);
    }
    elseif (function_exists('mysql_escape_string'))
    {
        $str = mysql_escape_string($str);
    }
    else
    {
        $str = addslashes($str);
    }

    // escape LIKE condition wildcards
    if ($like === TRUE)
    {
        $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    }

    return $str;
}

Обратите внимание, что это просто экранирование символов, поэтому запросы MySQL не будут прервать или сделать что-то неожиданное, и используется только в контексте запроса к базе данных для обеспечения правильного синтаксиса на основе того, что вы ему передаете.

Нет магии, которая делает все данные безопасными для любого контекста (например, HTML, CSV или XML-вывода), и на всякий случай, если вы об этом подумали: xss_clean() не является универсальным решением и не является на 100% пуленепробиваемым, иногда это на самом деле совершенно неуместно. Класс активной записи автоматически выполняет экранирование запроса, но для все остальное, что вы должны экранировать/очищать данные вручную правильным способом для данного контекста, с помощью вашего вывода, а не вашего ввода.

 9
Author: Wesley Murch, 2011-11-05 15:55:45

Активная запись только экранирует данные, больше ничего. Внедрение SQL-кода предотвращается путем экранирования. Затем используйте проверку на формах с их классом проверки. Должен позаботиться о ваших проблемах. Вот ссылка на другие элементы безопасности CodeIgniter:

Безопасность пользовательского интерфейса CodeIgniter

 3
Author: TSquared, 2018-02-16 14:05:13

Вы всегда можете увидеть последний запрос, сделанный с помощью метода last_query().

$this->db->last_query()

Вы увидите, как именно выглядел запрос, чтобы проверить, правильно ли он обработан.

 1
Author: Bojan Bjelic, 2018-02-16 14:05:35