1

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


第一种情况: 用户应该能够输入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>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


ps

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


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

4

1 回答 1

2

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.
于 2012-10-26T17:38:17.590 回答