Я хотел бы знать, какая наилучшая практика для дезинфекции ввода пользователя с помощью Codeigniter.
Я понимаю, что CI предлагает form_validation, например set_rules.
'set_rules'=>'trim|xss_clean|alpha_numeric|htmlspecialchars'
«Любая собственная функция PHP, которая принимает один параметр, может использоваться как правило, например, htmlspecialchars, trim, MD5 и т. Д.»
Мой вопрос сейчас,
достаточно ли этого, чтобы защитить нас от атак xss, sql и т. д.?
какие существуют другие правила, которые я могу применить?
с точки зрения производительности, дорого ли нам применять все эти правила для всех входных данных?
Я понимаю, что MD5 является хеш-функционалом, но что произойдет, если вы установите MD5 как часть правила?
выше, что я добавил также проверку JavaScript. Я нахожусь на правильном пути для дезинфекции входных данных и проверки входных данных пользователя? Пожалуйста посоветуй.
Санитирование – это больше, чем просто запуск вашего входа через всевозможные фильтры.
Санирование ваших данных не означает, что ваше приложение не загрязняет ваши данные пользователями, которых вы не хотите.
Большой вопрос, однако, чего вы не хотите?
Первый пример
Вы создали страницу, позволяющую пользователю отправлять текстовое сообщение. Ваш ожидаемый вход будет номером телефона и текстовым сообщением.
Глядя на ссылку Rule в руководстве, я бы, вероятно, пошел на эти правила:
numeric|exact_length[8]
Эти правила, поскольку я хотел бы удостовериться, что ввод является nummeric и что вход соответствует длине phonenumbers в моем регионе. Поскольку я уже подтверждаю, что ввод является числовым, я могу предположить, что попытки внедрения XSS и SQL должны завершиться неудачно (поскольку эти атаки содержат нечисловые символы).
Для поля текстовых сообщений я бы использовал обрезку и требуемый: trim|required
поскольку я не посылаю пустое сообщение.
Второй пример
Позволяя пользователям комментировать, это хороший способ разрешить пользователям рассылать спам на вашем сайте или вводить вредоносный код.
В принципе, вы не имя, письмо и комментарий.
Все входные данные требуются. Электронная почта должна быть проверена. Но комментарий и имя должны иметь некоторую очистку XSS и служебных пространств / строк.
Моя проверка с помощью sanitazion будет выглядеть так:
$this->form_validation->set_rules('name', 'Name', 'required|trim|xss_clean'); $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email'); $this->form_validation->set_rules('comment', 'Comment', 'required|trim|xss_clean');
Санитируйте то, что вы должны – не то, что можете, – и сделайте санитазитон для того, что вам нужно.
Убедитесь, что когда вы вставляете данные на свой сервер, чтобы использовать Active Record / Query Builder для правильного выхода из вашего ввода или того, что вы используете Query Bindings, который делает то же самое для вас.
Частная функция, если вы ищете,
function sanitizeString($value = ''){ $value = trim($value); if (get_magic_quotes_gpc()) { $value = stripslashes($value); } $value = strtr($value,array_flip(get_html_translation_table(HTML_ENTITIES))); $value = strip_tags($value); $value = mysqli_real_escape_string(get_mysqli(), $value); $value = htmlspecialchars($value); return $value; } function get_mysqli() { $db = (array)get_instance()->db; return mysqli_connect('localhost', $db['username'], $db['password'], $db['databse']); }
Я использую это как настраиваемую функцию для дезинфекции каждого параметра, переданного в форме, и в дальнейшем мы можем добавить больше пользовательских функций, я надеюсь. Всегда иметь пользовательскую функцию – это преимущество array_map
или array_walk
которое также может быть использовано для упрощения его использования для массивов, таких как $ _GET, $ _POST и т. Д.