Как Codeigniter обрабатывает экранирование? - PullRequest
15 голосов
/ 04 января 2012

Я использую CodeIgniter.

Недавно я прочитал книгу по PHP и увидел некоторые функции для экранирования вывода на сервер в базу данных, используя

*_escape_string()

и с сервера в браузер, используя:

htmlentities()
htmlspecialchars()

В моем приложении Codeigniter, как обрабатываются эти функции?Это внутренне обрабатывается платформой, или я должен вручную обрабатывать это?

В проверке формы Ccodeigniter я видел xss_clean

$this->form_validation->set_rules('password', 'Password', 'required|xss_clean|min_length[6]|matches[confirmpassword]' );

Is xss_clean для предотвращения перекрестного сайтасценариев, или это касается вышеупомянутого, о котором я упоминал?

Ответы [ 5 ]

15 голосов
/ 04 января 2012

Если вы используете класс Active Record, вам обычно не нужно экранировать все, что вы отправляете в базу данных - это делается автоматически:

http://codeigniter.com/user_guide/database/active_record.html

"Это также позволяет выполнять более безопасные запросы, поскольку значения автоматически экранируются системой."

Ручное экранирование, похоже, уходит в прошлое, так как большинство людей сейчас используют PDO для взаимодействия с базой данных, используя параметризованные запросы с заполнителями вместо слияния строк SQL. CI все еще использует функции mysql_* для внутреннего использования.

CI xss_clean(), на мой взгляд, более безопасен для тех из нас, кто не знает, как и когда правильно экранировать данные. Обычно вам это не нужно. Это стало объектом критики как за медленный, агрессивный подход к санации данных, так и за то, что он «недостаточно хорош».

Для экранирования вывода HTML в большинстве случаев htmlspecialchars() - это все, что вам нужно, но вы можете использовать функцию xss_clean() в любое время. Я не предлагаю использовать его в качестве правила проверки формы, потому что это повредит ваш ввод, вставив [removed], где бы он ни нашел что-нибудь «непослушное» в исходной строке. Вместо этого вы можете просто вызвать его вручную, чтобы очистить вывод .

Резюме:

  • База данных: CI (обычно) будет экранировать строки, передаваемые в класс Active Record.
    Подробнее см. В руководстве пользователя: http://codeigniter.com/user_guide/database/queries.html

  • HTML output : Вам необходимо самостоятельно выйти из вывода HTML с помощью htmlspecialchars() или использовать функцию CI html_escape() (по состоянию на 2.1.0). Это , а не выполняется автоматически, потому что нет способа узнать контекст, в котором вы используете данные.

  • xss_clean() - Если вы знаете, что делаете, вам это не нужно. Лучше использовать на выходе, чем на входе.

2 голосов
/ 04 января 2012

Представления CodeIgniter по умолчанию - это просто PHP, поэтому вы можете использовать htmlentities () и htmlspecialchars () в ваших файлах представлений.

Для экранирования данных в базу данных (т. Е. Предотвращения внедрения SQL) CodeIgniter предлагает параметризованные запросы.В основном, положить?в SQl, куда вы хотите вставить кусок данных, а затем предоставить все данные в массиве.См. «Привязки запросов» в http://codeigniter.com/user_guide/database/queries.html.. Также на этой странице см. «Экранирование запросов», в котором описаны оболочки CI для функций * _escape_string.Тем не менее, привязки запросов / параметризованные запросы являются лучшим подходом.

0 голосов
/ 15 июня 2019

Вы можете создать вспомогательную функцию:

function my_escape($str) {
if (get_magic_quotes_gpc()) {
    $str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
0 голосов
/ 11 января 2017

Добавить эту функцию в пользовательский вспомогательный файл

function escape_output($string)
{
    $newString = str_replace('\r\n','<br/>',$string);
    $newString = str_replace('\n\r','<br/>',$newString);
    $newString = str_replace('\r','<br/>',$newString);
    $newString = str_replace('\n','<br/>',$newString);
    $newString = str_replace('\'','',$newString);
    return $newString;
}

Просмотреть функцию вызова

<?php echo escape_output("Bhavin\'s \"code"); ?>
0 голосов
/ 04 января 2012

В codeignater, если вы не используете активный класс записи, тогда просто в sql запросе используйте

$this->db->escape($varaiable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...