Точно так (для драйвера 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 .