Php 为什么赢了';这不接受在@后面加连字符的电子邮件地址吗?
这是在我们的网站上注册接收电子邮件新闻更新的代码。它工作得很好,除非电子邮件地址在@后面有一个连字符,否则它会抛出一个错误框:Php 为什么赢了';这不接受在@后面加连字符的电子邮件地址吗?,php,javascript,mysql,Php,Javascript,Mysql,这是在我们的网站上注册接收电子邮件新闻更新的代码。它工作得很好,除非电子邮件地址在@后面有一个连字符,否则它会抛出一个错误框: > The page at http://www.MySite.com says: > > Please Fix the following: > > E-mail 试验-test@test.com有效,但是test@test-test.com没有。有什么想法吗 从email.js: function checkSubmit
> The page at http://www.MySite.com says:
>
> Please Fix the following:
>
> E-mail
试验-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."')";
是/否?试试这个
$queryr = sprintf("SELECT emailid FROM master_email WHERE email LIKE '%s' LIMIT 1",
mysql_real_escape_string($email));
并对insert查询执行相同的操作
另外,您只是要求SQL注入:尝试以下方法:
var emailpat = /^[^@]+@[^@]+\.[^@\.]{2,}$/;
电子邮件地址应该只有一个@符号,并且不能是第一个字符。在@之后,至少需要一个点,后跟2个或更多字母
是的,这也接受无效的电子邮件地址。如果您希望确保用户输入有效的电子邮件地址,则应向该地址发送电子邮件,并等待用户采取行动(即输入电子邮件中的代码)
编辑
更新了regex,因此域部分不再局限于罗马字母TLD。其他字母是允许的,尽管可能还不是很常见。有关警告信息,请参阅wikipedia。警告您的代码容易受到sql注入攻击。由于您发布的代码中没有“请修复”字样,因此它显然不是错误的来源。请尝试将问题缩小到导致错误的代码的实际部分,然后发布。提供的代码不包含任何验证。你应该粘贴验证代码(最有可能是在checkSubmit()JS函数中)。你知道很多域都包含连字符吗?谈谈cargo cult编程……那堵代码墙的确切位置是“请修复以下内容”?发布的代码不会生成您的错误消息。这不是逃避查询的正确方法。事实上,您不想逃避整个查询,只想
$email
。位于的页面上说:请修复以下是Javascript警报消息,不是由PHP生成的。您能提供发生这种情况的页面吗?不要发布u否则,由于明显的sql注入攻击,您将在10分钟内丢失整个数据库。说真的,现在请将页面脱机!正确的转义方法不是mysql\u select\u db(“database”,$dbx);$email=mysql\u real\u escape\u string($email);$queryx=“INSERT into master\u email(emailid,cellmail,email)值吗(“,”,“$email.”“;
我找到了另一个选择-你看到这有什么坏处吗?/^[A-Za-z0-9.\u%-]+@[A-Za-z0-9.-+\.[A-Za-z]{2,4}$/;
好的,是的。它不允许在本地部分使用所有合法字符(!\35;$%&'*+/=?
和反勾号)它不接受像.travel
和.museum
这样的新TLD,也不接受国际化域名,但我也必须更新我的答案来解决这个问题更新后的答案限制更少。@Downvoter:想解释一下吗?还有,你有其他javascript解决方案吗?你是唯一一个关注我的实际问题而不是我发布的代码的辅助问题的人。再次感谢。