【问题标题】:PHP : how to clean user input leaving UTF-8 (Russian, Turkish, English)?PHP:如何清理离开 UTF-8(俄语、土耳其语、英语)的用户输入?
【发布时间】:2012-10-26 17:06:38
【问题描述】:

干净的用户提交了意外或故意垃圾的输入。我编写了以下内容来执行此操作,并且有兴趣看到针对同一问题的更有效或更好的解决方案。 注意:在 mysql 方面,我在这些之后使用 mysqli 准备语句


第一种情况: 用户应该可以输入 UTF-8(只需要俄语、土耳其语、英语)字符,以及“_”、(这是为了清除用户输入的“用户名”) em>。

输入:

$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>test@com.kz()(  РЛОкуц <em> ";
$email5 = "++ ?ЕНГКУ   teЛОДКУst@mail.уцкru...";
$email6 = " ?ЕНГКУ   teЛОДКУst@.уцкua";
$email7 = " ++ fake.some--one+tag@gmail.com++";

由于这部​​分是用于电子邮件的,并且应该只接受英文字符,所以我编写了以下函数来清理和验证;

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
testi@com.tr : valid
test@com.kz : valid
test@mail.ru : valid
testua : false
fake.some--one+tag@gmail.com : valid


p.s.

- 我不需要在此电子邮件输入字段中完全符合 UTF-8 / RFC,也不需要包含所有可能包含在电子邮件中的特殊字符。我更喜欢限制性更强,并在最初的问题中说明需要什么以及函数的作用。这里的想法更多的是摆脱错误输入的字符而不是验证电子邮件,在一个在线站点中我宁愿不更正任何东西,而只是抛出一个错误。


- 更新了干净电子邮件功能中的正则表达式以包含 + 和 - 字符。

【问题讨论】:

    标签: php regex user-input input-sanitization


    【解决方案1】:

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

    不要编写自己的安全控制!在为每个 Web 应用程序或 Web 服务开发安全控制时重新发明轮子会导致时间浪费和大量安全漏洞。 OWASP 企业安全 API (ESAPI) 工具包可帮助软件开发人员防范与安全相关的设计和实施缺陷。

    $email1 = 'fake.someone+tag@gmail.com'; // this is perfectly valid email
    echo clean_email($email1).' : '.valid(clean_email($email1));
    // outputs: fake.someonetag@gmail.com : valid
    // and you'll be emailing the wrong person.
    

    【讨论】:

    • 您的电子邮件验证不正确。 fake.someone+tag@gmail.com 完全有效。所以你所做的就是去掉我的加号,然后验证它是否正确。那是误报。您不能更改某人的电子邮件,然后将其验证为真。
    • RFC6530 amongst others 定义电子邮件中的 UTF-8 用法。所以从长远来看,这将是可能的。我完全同意安东尼的观点。
    • @AnthonyHatzopoulos - 我的错误,已更正。在这种情况下,注册者根本无法确认他们的电子邮件(通过那里发送的消息),因此无法注册..
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2013-10-02
    • 2013-08-22
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多