Я создаю приложение Codeigniter, и я изо всех сил стараюсь предотвратить инъекции SQL. Я использую метод Active Record для построения всех моих запросов. Я знаю, что Active Record автоматически санирует вход, но мне интересно, в какой степени? Он просто избегает всех цитат или делает это больше? Как насчет предотвращения запутанных инъекций SQL или других более сложных видов?
В принципе, я ищу подробное объяснение того, как CI санирует данные. Кто-нибудь знает?
Точно так же (для драйвера MySQL):
mysql_real_escape_string()
(это будет в 99% случаев) mysql_escape_string()
addslashes()
%
и _
в условиях LIKE
через str_replace()
/** * 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()
Вы точно увидите, как выглядел запрос, поэтому вы можете проверить, правильно ли продезинфицирован.