【问题标题】:Why won't this accept email addresses with a hyphen after the @?为什么这不接受@ 后带有连字符的电子邮件地址?
【发布时间】:2011-08-24 19:05:07
【问题描述】:

这是注册以在我们的网站上接收电子邮件新闻更新的代码。它工作得很好,除非电子邮件地址在@ 后面有一个连字符,否则它会抛出一个错误框:

> The page at http://www.MySite.com says:
> 
> Please Fix the following: 
> 
> E-mail

test-test@test.com 有效,但 test@test-test.com 无效。有任何想法吗?

来自email.js

    function checkSubmit(thisDept){

    var email = $('email').value;


    var message = "Please Fix the following: \r\n";




    var emailpat = /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/;
    if( !email.match(emailpat) ) {
        message += "E-mail \r\n";
    }





    if(message == "Please Fix the following: \r\n"){

            submitEmail(email,thisDept);

    } else {
            alert(message);
    }



    }


function submitEmail(email,thisDept){
        new Ajax.Updater( "EAlertContainer","php/ealerts.php", {
     method: 'post', parameters: { email: email } });
}

编辑:感谢您对我发布的原始代码漏洞的所有担忧。所以我确定,逃避它的正确方法是:

mysql_select_db("DATABASE",$dbx); 
$email=mysql_real_escape_string ($email); 
$queryx = "INSERT into master_email (emailid,cellmail,email) VALUES ('','','".$email."')";

是/否?

【问题讨论】:

  • 警告您的代码容易受到 sql 注入攻击。
  • 由于您发布的代码中没有“请修复”字样,因此显然不是错误的根源。请尝试将问题缩小到导致错误的代码的实际部分并发布。
  • 提供的代码不包含任何验证。您应该粘贴验证代码(很可能在 checkSubmit() JS 函数中
  • 您知道很多包含连字符的域吗?
  • 谈论货物狂热的编程......那堵代码墙到底在哪里有“请修复以下内容”?发布的代码不会生成您的错误消息。

标签: php javascript mysql


【解决方案1】:

试试这个:

var emailpat = /^[^@]+@[^@]+\.[^@\.]{2,}$/;

电子邮件地址应该只有一个@符号,并且不能是第一个字符。在 @ 之后,您至少需要一个点,后跟 2 个或更多字母。

是的,这也接受无效的电子邮件地址。如果您想确保用户输入了一个有效的电子邮件地址,您应该向该地址发送一封电子邮件并等待用户采取行动(即输入电子邮件中的代码)。

编辑

更新了正则表达式,因此域部分不再局限于罗马字母 TLD。其他字母是允许的,虽然可能不是很常见(还)。请参阅维基百科了解examples

【讨论】:

  • 我找到了另一种选择 - 你觉得这有什么缺点吗? /^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;
  • 嗯,是的。它不允许本地部分中的所有合法字符(! # $ % & ' * + - / = ? ^ _ { | } ~ 和反引号),并且它不接受新的 TLD 像 .travel.museum。而且它不接受国际化域名,但我也必须更新我的答案来解决这个问题。 (见en.wikipedia.org/wiki/.δοκιμή
  • 更新了答案,限制更少。
  • @Downvoter:需要解释一下吗?另外,您有替代的 javascript 解决方案吗?
  • 赞成你是唯一一个关注我的实际问题而不是我发布的代码的辅助问题的人。再次感谢。
【解决方案2】:

试试这个。

$queryr = sprintf("SELECT emailid FROM master_email WHERE email LIKE '%s' LIMIT 1",
          mysql_real_escape_string($email));

并对插入查询执行相同的操作。

另外,您只是要求进行 SQL 注入:P

【讨论】:

  • 这不是逃避查询的正确方法。实际上,您不想转义整个查询,而只想转义$email
  • MySite.com 的页面说:请修正以下内容是 Javascript 警告消息,不是由 PHP 生成的。
  • 您能否提供发生这种情况的页面?
  • 不要发布网址,否则您将在 10 分钟内丢失整个数据库,这要归功于明显的 sql 注入攻击。说真的,现在让页面离线!
  • 不应该是mysql_select_db("DATABASE",$dbx); $email=mysql_real_escape_string ($email); $queryx = "INSERT into master_email (emailid,cellmail,email) VALUES ('','','".$email."')";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多