是否仅使用javascript验证表单并阻止用户提交禁用JS的表单?

是否仅使用javascript验证表单并阻止用户提交禁用JS的表单?,javascript,Javascript,我正在尝试为我的网站创建一个经过验证的注册表单,目前正在编写一个用于实践的演示。我能够使用javascript验证表单。然而,我在某个地方读到,表单应该在客户端和服务器端都进行验证,因为JS可以被禁用。我想知道,如果所有javascript验证都不满意(我注意到eBay在其注册表中使用了类似的方法),是否有一种方法可以简单地禁用submit按钮?如果是,我将如何实现这一点 这就是我目前的处境: <script type="text/javascript"> function vali

我正在尝试为我的网站创建一个经过验证的注册表单,目前正在编写一个用于实践的演示。我能够使用javascript验证表单。然而,我在某个地方读到,表单应该在客户端和服务器端都进行验证,因为JS可以被禁用。我想知道,如果所有javascript验证都不满意(我注意到eBay在其注册表中使用了类似的方法),是否有一种方法可以简单地禁用submit按钮?如果是,我将如何实现这一点

这就是我目前的处境:

<script type="text/javascript">
function validateEmail(email) { 

    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

    if(re.test(email)) {
        document.getElementById('result').innerHTML = '<img src="http://iconlet.com/icons/kensaunders/4/CheckMark.png" style="width:15px;"/> Valid';
    } else {
        document.getElementById('result').innerHTML = '<img src="http://biglistbigsales.com/m/templates/GPT/images/x_xMarkRed4.png" style="width:15px;"/> Invalid';
    }
} 
function validatePass(pass){
    if(pass.length < 6){
        document.getElementById('pass-result').innerHTML='<img src="http://biglistbigsales.com/m/templates/GPT/images/x_xMarkRed4.png" style="width:15px;"/>Your password must be at least 6 characters';
    }else{
        document.getElementById('pass-result').innerHTML='<img src="http://iconlet.com/icons/kensaunders/4/CheckMark.png" style="width:15px;"/>valid';
    }
}
function validateCPass(cpass){
    var pass = document.getElementById('pass').value;

    if(cpass != pass){
        document.getElementById('cpass-result').innerHTML="Passwords must match";
    }else{
        document.getElementById('cpass-result').innerHTML='<img src="http://iconlet.com/icons/kensaunders/4/CheckMark.png" style="width:15px;"/>';
    }   
}
</script>
</head>
<body>
    <form action="practice.php" method="post">
        e-mail:<br/><input id="email" type="text" onblur="validateEmail(this.value)" /><span id="result"></span>
        <br/><br/>Password:<br/><input type="password" id="pass" onblur="validatePass(this.value)"><span id="pass-result"> </span>
        <br/><br/>Confirm Password:<br/><input type="password" id="confpass" onblur="validateCPass(this.value)"> <span id="cpass-result"></span>
        <br/><input type="submit">
    </form>
</body>

功能验证邮件(电子邮件){
变量re=/^([^()[\]\\,;:\s@\“]+(\.[^()[\]\,;:\s@\“]+)*)(\'+\”)(\[[0-9{1,3}.[0-9]{1,3}.[0-9]{0-9]{1,3}.[1,3}.[0-9]{1,3}])){124;([a-zA Z-0-9]+-zA 2]/];
如果(重新测试(电子邮件)){
document.getElementById('result')。innerHTML='Valid';
}否则{
document.getElementById('result')。innerHTML='Invalid';
}
} 
函数validatePass(通过){
如果(通过长度<6){
document.getElementById('pass-result')。innerHTML='您的密码必须至少包含6个字符';
}否则{
document.getElementById('pass-result')。innerHTML='valid';
}
}
函数ValidatePass(cpass){
var pass=document.getElementById('pass')。值;
如果(cpass!=通过){
document.getElementById('cpass-result').innerHTML=“密码必须匹配”;
}否则{
document.getElementById('cpass-result')。innerHTML='';
}   
}
电子邮件:


密码:


确认密码:


不,这是不可能的,原因有很多:

  • 可访问性。您客户的浏览器可能不支持Javascript,或者用户可能已禁用它(是的,有些人会)

  • 安全性。web应用程序向整个internet公开HTTP接口。您甚至不需要浏览器来发送HTTP请求!因此,您的后端需要将任何HTTP请求视为不受信任的请求并对其进行验证。这适用于所有来自不可靠源的数据

因此:

任何正确的web应用程序都必须进行服务器端验证

客户端验证是一种UI增强功能,可通过提供更快的反馈来改善用户体验。

您可以在默认情况下禁用该按钮,然后让JavaScript重新启用它。但是,这不会阻止用户自己使用跨站点脚本注入或更现实地使用使用FireBug之类的浏览器或默认内置的开发工具

我强烈建议同时进行客户端和服务器端验证,无论是为了用户体验,还是为了系统的完整性和安全性。如果您根本没有时间进行这两方面的验证,那么服务器端肯定会优先考虑。客户端验证的目的是为了更好地为用户服务;不幸的是,用户当你的代码被破坏时,你不会有同样的感觉


始终进行服务器端验证。:/p>在服务器中检查内容的原因是恶意用户可以向服务器手动发送crafter POST或GET请求,而不管这些表单是否存在于应用程序中或是否在浏览器中被禁用。仅禁用表单不足以解决此问题



如果你仍然想在非JS浏览器中禁用表单,你可以做的是在默认情况下禁用它们并在JS上启用它们。

你不需要重新发明轮子。有很多工具可以使用JavaScript进行验证。例如,检查jQuery验证插件;你可以用几行代码验证表单

关于服务器端验证,您应该始终在服务器上验证您的数据。JavaScript验证旨在防止用户错误,但它们根本不会为您的系统提供任何安全性