как codeigniter очищает входные данные?
Я создаю приложение Codeigniter и изо всех сил стараюсь предотвратить SQL-инъекции. Я использую метод активной записи для построения всех своих запросов. Я знаю, что активная запись автоматически очищает входные данные, но мне интересно, до какой степени? Он просто избегает всех цитат или делает больше? Как насчет предотвращения запутанных SQL-инъекций или других более продвинутых видов?
В принципе, я ищу подробное объяснение того, как CI очищает данные. Кто-нибудь знает?
3 answers
Точно так же (для драйвера 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% пуленепробиваемым, иногда это на самом деле совершенно неуместно. Класс активной записи автоматически выполняет экранирование запроса, но для все остальное, что вы должны экранировать/очищать данные вручную правильным способом для данного контекста, с помощью вашего вывода, а не вашего ввода.
Активная запись только экранирует данные, больше ничего. Внедрение SQL-кода предотвращается путем экранирования. Затем используйте проверку на формах с их классом проверки. Должен позаботиться о ваших проблемах. Вот ссылка на другие элементы безопасности CodeIgniter:
Вы всегда можете увидеть последний запрос, сделанный с помощью метода last_query()
.
$this->db->last_query()
Вы увидите, как именно выглядел запрос, чтобы проверить, правильно ли он обработан.