Санитизация и проверка

Вернусь с другим вопросом.

Я наткнулся на эту действительно замечательную функцию, которая, как мне кажется, очищает и проверяет (я очень надеюсь, что это утверждение действительно верно). Вот функция и ее использование.

     if(funcChkLogin($_POST['username']))
        {
          $username = escape_data($_POST['username']);
        } 

     funcChkLogin($str)
     {
         return preg_match("/^[A-z0-9_\-\.]{2,20}$/", stripslashes(trim($str)));
     } 

     escape_data($data)
     {
       $data = mysql_real_escape_string(trim($data));
       $data = strip_tags($data);
       return $data;
     } 

Поскольку я читал, что использование стрипов создает проблемы, я хотел бы спросить, насколько безопасен и надежен этот метод для санации. Можно ли его улучшить?

Я знаю, что использование PDO лучше, но могут быть данные, которые не попадают в базу данных, тогда использование хорошей функции, подобной этой, было бы хорошей идеей, чтобы убедиться, что у нас работает чистый PHP-код. Правильно?

Спасибо всем !


person Ajoo    schedule 02.12.2014    source источник
comment
Вы пытаетесь проверить, что имя пользователя является адресом электронной почты? Почему вы хотите дезинфицировать предоставленное пользователем имя пользователя. Он либо действителен, либо нет, я бы не советовал его менять. Я бы также не рекомендовал использовать любой код, основанный на функциях mysql_*.   -  person Mike Brant    schedule 02.12.2014
comment
Имя пользователя — это имя пользователя, подобное его имени пользователя для входа в систему. Это не электронная почта. Для электронной почты я бы использовал другой фильтр, например funcChkEmail. Извините, я думаю, что использовал фильтр для электронной почты, чтобы проверить логин пользователя. Интересно, могу ли я отредактировать это в исходном вопросе. Итак, я изменил его.   -  person Ajoo    schedule 02.12.2014


Ответы (2)


mysql_real_escape_string может быть небезопасным, если вы не примете особые меры предосторожности. Это также устарело. Используйте ПДО.

Я знаю, что использование PDO лучше, но

Никаких "но. Сделайте правильный выбор.

person Jackson    schedule 02.12.2014
comment
Конечно. Но что, если я использую переменную, которая содержит пользовательский ввод только для сравнения с некоторыми данными из базы данных или другой переменной, то нет ли необходимости дезинфицировать такую ​​переменную?? Я читал, что всегда рекомендуется дезинфицировать/исключать пользовательский ввод и выполнять на нем проверки ограничений и данных. Какие экранирующие функции мы должны использовать для таких переменных? Спасибо. - person Ajoo; 02.12.2014
comment
Я бы использовал подготовленные операторы для любой интерполированной переменной, даже для моих собственных переменных. Я также не доверяю себе оценивать код SQL. - person Jackson; 02.12.2014
comment
Экранирование (для базы данных) не требуется, если вы используете подготовленные операторы. (Вы все равно захотите экранировать значения, напечатанные в html, с помощью htmlspecialchars.) - person Jackson; 02.12.2014
comment
ОК спасибо всем за ответы - person Ajoo; 02.12.2014

Не сворачивайте свои собственные функции привязки/экранирования

Единственное, для чего вы должны использовать свой собственный код, — это «правила», которым вы действительно хотите, чтобы пользовательские данные соответствовали. В PHP уже есть инструменты для работы со всеми базами данных. Также в нем уже есть функция для работы с выводом в html. Концепция очистки всего — это, как правило, реакция чрезмерной компенсации на осознание того, насколько ужасным может быть доверие к пользовательскому вводу, и она неприменима к большинству ситуаций, когда вы пытаетесь ее применить. Использовать существующие встроенные функции (и PDO).

Данные обычно должны преобразовываться только при изменении формата/хранилища.

Вместо того, чтобы пытаться очистить все возможные способы использования данных в будущем, вы должны учитывать, что когда вы меняете формат данных, вы должны экранировать или преобразовывать его в последний возможный момент в этот новый формате, чтобы он имел функции отображения нового носителя, на котором вы хотите его разместить.

Используйте правильную функцию (и PDO) для правильной цели

Хотите, чтобы он попал в базу данных? привяжите его для подготовленного запроса в то время. Хотите поместить это в свой html? экранируйте его для html именно в это время. Хотите в json? json_encode прямо перед выводом в API). Функции, которые выполняют за вас эти обычные процессы экранирования/связывания/преобразования, всегда написаны на языке php, поэтому не изобретайте велосипед.

Один из связанных повторяющихся ответов содержит несколько замечательных примеров функций, которые ускользают при преобразовании из переменной php в ячейку данных mysql или из переменной php в область отображения текста html. Просто повторно используйте их.

person Kzqai    schedule 02.12.2014
comment
Спасибо за ответ - person Ajoo; 02.12.2014