如何使用正则表达式在javascript中验证PHP电子邮件注入的电子邮件地址?

时间:2013-11-29 18:12:26

标签: javascript regex email

我想避免在电子邮件地址中出现%标志 因此,用户不会在电子邮件中添加其他标题。

然而,我对正则表达式完全不知所措,无法找到解决方案。

到目前为止我已经

/[%]+/

但在我的整个代码中,这确实将test@example.com%之类的电子邮件地址验证为真。
这是因为Firefox和Chrome有内部电子邮件检查,为type="email"指定input !!!

function validateEmail(sEmail) {
    var filter = /^[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,4}$/;
        filter2 = /^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*/;
        filter3 = /[%]+/                
        if (filter.test(sEmail) && filter2.test(sEmail) && !filter3.test(sEmail)) {
           return true;
        } else {
           return false;
        }
    }

顺便说一下。因为到目前为止我完全无法自己写这个,所以我找到了两个解决方案,我不确定哪个更好。 上面的一个(1)或2:

/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/

您怎么看?

2 个答案:

答案 0 :(得分:2)

您不应该使用正则表达式来防止注入。而是使用准备好的sql语句:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

答案 1 :(得分:1)

除非您完全了解有效的电子邮件地址,否则我不会使用正则表达式。相反,您应该参数化所有值,以便即使插入恶意代码,它也只会将其视为字符串。见OWASP:

https://www.owasp.org/index.php/Query_Parameterization_Cheat_Sheet


我看到你改变了问题。您实际上对修复PHP电子邮件头注入感兴趣。这比简单地过滤掉电子邮件地址中的单个字符要复杂得多。您需要检查黑客/机器人是否正在尝试注入多部分/表单数据(尤其是换行/回车,它从多部分消息的主体分隔标题),操纵表单和会话变量,以及过滤名称和其他字段(不应该不包含特殊字符。

电子邮件地址过滤不足以防止攻击。机器本身也需要正确配置。按照本指南执行操作以防止php注入(包括过滤换行符和软件配置的示例):http://static.askapache.com/pdf/xss-csrl-injection.pdf