PHP: как очистить пользовательский ввод, оставив UTF-8 (русский, турецкий, английский)?

Чистый пользователь представил входные данные случайного или преднамеренного мусора. Я написал следующее, чтобы сделать это, и мне было бы интересно увидеть более эффективные или лучшие решения той же проблемы. Примечание. Я использую подготовленные операторы mysqli после них на стороне mysql.


Первый случай: пользователь должен иметь возможность вводить символы UTF-8 (необходимы только русский, турецкий, английский) и '_', (это для очистки ввода пользователем имени пользователя) .

входы:

$lang1 = " \  $:;/<ŞĞğş43\24234şğ_Ğüğsdç<a> #$#@!@^%*&^( <b></b>";
$lang2 = "еукд $ :;363 леВАЛДЖЫу-_жлаывф<em>вфы34234</em>вфывф#@!@^%*&^(&*)(()&^@#!~";
$lang3 = "dasda$RWERs636  da<b>asd_45646asd<em>";


Чтобы очистить их, я написал эту простую функцию

function clean($s = '')
{
  $c = mb_strtolower((trim($s)), 'UTF-8');
  $c = preg_replace ( '/[^0-9\p{Cyrillic}\p{Ll}\w]/u', '', $c); 
  $c = htmlentities(strip_tags($c), ENT_QUOTES, 'UTF-8');
  return $c;
}

который возвращает то, что мне нужно;

şğğş4334şğ_ğüğsdçabb
еукд363левалджыу_жлаывфemвфы34234emвфывф
dasdadabasd_45646asdem



Второй случай: разрешены только английские символы, недопустимые символы и другие символы UTF-8 должны быть удалены. (это для очистки ввода электронной почты пользователем)

входы:

$email1 = "dasda @:;/<ŞĞğ  ВАЛДЖЫуda<b>asd_45646asd<em>.com";
$email2 = "^%(#*$#)$&(237469879şşşdsasadsdasd/||\><? ВАЛДЖЫуda<b>asd_45646asd<em> .com";
$email3 = "t est i @coЬm.tr";
$email4 = "&/(/&^+'!+!^+<em>[email protected]()(  РЛОкуц <em> ";
$email5 = "++ ?ЕНГКУ   teЛОДКУst@mail.уцкru...";
$email6 = " ?ЕНГКУ   teЛОДКУst@.уцкua";
$email7 = " ++ [email protected]++";

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

function clean_email($s = '')
{
  $c = mb_strtolower((trim($s)), 'UTF-8');
  $c = filter_var(strip_tags($c), FILTER_SANITIZE_EMAIL);
  $c = preg_replace ('/(?i)[^a-z\.@_\-\+\d]|[.@]{2,}/u', '', $c);
  $c = preg_replace ( '/^[+.-@]{1,}|[+.-@]{1,}$/u', '', $c);
  return $c;
}       

function valid ($v = '') 
{      
  if (filter_var($v, FILTER_VALIDATE_EMAIL) == TRUE) {return 'valid';} else {return 'false';}
}

при вызове через:

echo clean_email($email1).' : '.valid(clean_email($email1)).'<br/>';  

возвращает то, что мне нужно

dasda : false
dsasadsdasd : false
[email protected] : valid
[email protected] : valid
[email protected] : valid
testua : false
[email protected] : valid


п.с.

- Мне не нужно полное соответствие UTF-8/RFC в этом поле ввода электронной почты, а также мне не нужно включать все возможные специальные символы, которые могут быть включены в электронное письмо. Я предпочитаю быть более строгим и указывать в начальном вопросе, что нужно, а также что делает функция. Идея здесь больше в том, чтобы избавиться от опечаток, чем в проверке электронной почты, на онлайн-сайте я бы предпочел ничего не исправлять, а просто выдать ошибку.


— обновлено регулярное выражение в функции очистки электронной почты, чтобы включить символы + и —.


person wark91    schedule 26.10.2012    source источник


Ответы (1)


https://code.google.com/p/owasp-esapi-php/

Не пишите свои собственные элементы управления безопасностью! Изобретение велосипеда, когда дело доходит до разработки элементов управления безопасностью для каждого веб-приложения или веб-службы, приводит к напрасной трате времени и огромным дырам в безопасности. Наборы инструментов OWASP Enterprise Security API (ESAPI) помогают разработчикам программного обеспечения защищаться от недостатков проектирования и реализации, связанных с безопасностью.

$email1 = '[email protected]'; // this is perfectly valid email
echo clean_email($email1).' : '.valid(clean_email($email1));
// outputs: [email protected] : valid
// and you'll be emailing the wrong person.
person Anthony Hatzopoulos    schedule 26.10.2012
comment
Проверка вашей электронной почты неверна. [email protected] совершенно верно. Итак, что вы делаете, так это удаляете мой знак плюса, а затем проверяете его на истинность. Это ложноположительный результат. Вы не можете изменить чей-то адрес электронной почты, а затем подтвердить его истинность. - person Anthony Hatzopoulos; 26.10.2012
comment
RFC6530 среди прочего определяет использование UTF-8 в электронной почте. Так что в долгосрочной перспективе это будет возможно. И я полностью согласен с Антоном. - person Philip Whitehouse; 27.10.2012
comment
@AnthonyHatzopoulos - моя ошибка, исправил. В таком случае регистрант просто не сможет подтвердить свою электронную почту (через отправленное туда сообщение) и, следовательно, не сможет зарегистрироваться. - person wark91; 27.10.2012