как когниционист санирует исходные данные?

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

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

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

  • Tries 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 автоматически выполняет запрос, но для всего остального вы должны избегать / дезинфицировать данные вручную правильным образом для данного контекста с вашим выводом , а не с вашим вводом .

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

Безопасность в CodeIgniter UserGuide

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

$this->db->last_query()

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