2011-11-23 48 views
2

下面的代码可以用来攻击我的网站吗?ReDOS我应该担心ReDOS攻击吗?

或者只是在max_execution_time超标或者是过去的问题时才结束?

我用下面的代码(由Douglas Lovell)来验证我的网站emailaddresses:

function validate_email($email) 
{ 
    $isValid = true; 
    $atIndex = strrpos($email, "@"); 
    if (is_bool($atIndex) && !$atIndex) 
    { 
     $isValid = false; 
    } else { 
     $domain = substr($email, $atIndex+1); 
     $local = substr($email, 0, $atIndex); 
     $localLen = strlen($local); 
     $domainLen = strlen($domain); 
     if ($localLen < 1 || $localLen > 64) 
     { 
     // local part length exceeded 
     $isValid = false; 
     } 
     else if ($domainLen < 1 || $domainLen > 255) 
     { 
     // domain part length exceeded 
     $isValid = false; 
     } 
     else if ($local[0] == '.' || $local[$localLen-1] == '.') 
     { 
     // local part starts or ends with '.' 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $local)) 
     { 
     // local part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) 
     { 
     // character not valid in domain part 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $domain)) 
     { 
     // domain part has two consecutive dots 
     $isValid = false; 
     } 
     else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) { 
     // character not valid in local part unless 
     // local part is quoted 
     if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) { 
      $isValid = false; 
     } 
     } 
     if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) 
     { 
     // domain not found in DNS 
     $isValid = false; 
     } 
    } 

    return $isValid; 
} 
+2

它看起来有点像你在这里找到的:http://www.linuxjournal.com/article/9585?page=0,3 –

+0

@Jared Farrish以及它如何免疫ReDOS? – rook

+1

@Rook - [在此处查看](http://stackoverflow.com/posts/8235707/revisions)位于代码块右上方的行。 ')' –

回答

1

你使用这里的正则表达式都没有行为会很容易出现过度运行。

从名称判断,但checkdnsrr()可能需要一段时间,如果域的名称服务器没有响应。确保它有一个理智的超时。

相关问题