как codeigniter дезинфицирует входные данные? - PullRequest
11 голосов
/ 05 ноября 2011

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

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

Ответы [ 3 ]

9 голосов
/ 05 ноября 2011

Точно так (для драйвера 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% пуленепробиваемое, иногда оно на самом деле совершенно неуместно. Класс Active Record выполняет запрос, автоматически экранируя, но для всего остального вы должны вручную / санировать данные корректно для данного контекста, используя ваш output , а не input .

3 голосов
/ 05 ноября 2011

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

CodeIgniter UserGuide Security

1 голос
/ 05 ноября 2011

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

$this->db->last_query()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...