2014-11-14 67 views
1

我有一個聯繫表。提交時使用AJAX加載「/forms/contact_received.php」給我發電子郵件&將用戶的聯繫信息添加到數據庫。類似於數據庫中10%條目(及其相關電子郵件)的東西沒有電子郵件地址。jQuery驗證電子郵件允許空白不知何故

我似乎無法複製這個問題。有一段時間我有表單寄給我的用戶代理,希望他們都有相同的瀏覽器,但它是一個橫截面,一些Safari瀏覽器,一些Mozilla,一些IE瀏覽器,一些手機,一些桌面。此外,空白的電子郵件提交也不是惡意的,這些都是來自實際人類的合法問題。

我的劇本看起來是這樣的:

<script type="text/javascript"> 
function checkForm() { 
    hideAllErrors(); 
    var formIsValid = 
    showErrorAndFocusIf('FieldData0', isEmpty, 'nameError') 
    && showErrorAndFocusIf('FieldData2', isEmpty, 'emailError') 
    && showErrorAndFocusIf('FieldData2', isAnInvalidEmail, 'emailError2') 
    && showErrorAndFocusIf('FieldData1', isEmpty, 'questionError'); 
    return formIsValid; 
} 
function showErrorAndFocusIf(fieldId, predicate, errorId) { 
    var field = document.getElementById(fieldId); 
    if (predicate(field)) { 
    document.getElementById(errorId).style.display = 'inline'; 
    if (field.select) { 
     field.select(); 
    } 
    field.focus(); 
    return false; 
    } 
    return true; 
} 
function isEmpty(field) { 
    return field.value == ''; 
} 
function isAnInvalidEmail(field) { 
    var email = field.value; 
    var ok = "1234567890qwertyuiop[][email protected]_QWERTYUIOPASDFGHJKLZXCVBNM"; 
    for(i = 0; i < email.length; i++){ 
    if(ok.indexOf(email.charAt(i)) < 0) { 
     return true; 
    } 
    } 
    re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/; 
    re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; 
    return re.test(email) || !re_two.test(email); 
} 
function hideAllErrors() { 
    document.getElementById("nameError").style.display = "none" 
    document.getElementById("emailError").style.display = "none" 
    document.getElementById("emailError2").style.display = "none" 
    document.getElementById("questionError").style.display = "none" 
} 
</script> 

和我的HTML看起來像這樣:

<style> 
.error{display:inline;margin:0;} 
</style> 

<form id="contact" name="contact" action=""> 
    <b>Name</b> 
    <input class="valid" name="name" value="" maxlength="100" size="30" style="display:block;" type="text"> 

    <b>Email</b> (will not be published) 
    <input class="error" name="email" value="" maxlength="100" size="30" style="display:block;" type="email"> 
    <label class="error" generated="true" for="email">Please enter a valid email address</label> 

    <b>Question</b> 
    <textarea class="error" name="message" cols="50" rows="5" style="display:block;"></textarea> 
    <label class="error" generated="true" for="message">Please enter your message in the box above</label> 
    <input name="page" value="[URL]" type="hidden"> 
    <input class="btn" value="Contact Us" name="Submit" type="submit"> 
</form> 

什麼可能是我的驗證可能失敗的一些可能的情況呢?就像我說的,驗證對我來說很好,我無法弄清楚它將如何被繞過。

+1

javascript在瀏覽器中禁用?!無論如何,驗證也應該在服務器端完成 – 2014-11-14 21:43:46

+0

我們假設很多 - 驗證方法曾經被調用過(未顯示),如果是的話,何時;您的電子郵件字段要麼添加了一個匹配「FieldData2」的id,要麼這是虛擬的HTML,它仍然*真*接近實時HTML;驗證處理程序的結果不會被忽略;等 – 2014-11-14 21:47:12

回答

0

如果您的支票只在客戶端完成,那麼繞過它們是微不足道的。

例如,js禁用的任何用戶都不會有任何警告,並且會成功發佈您的表單。

您還必須在服務器端檢查這些值。

編輯:去

最好的辦法是經常做的所有檢查服務器端返回頁面解釋該問題。

然後,使用javascript改善用戶體驗,如果禁用,則回退到舊方法。

+0

我想知道,但並沒有真正消化它。通常被接受的最佳方式是什麼?我應該在它發佈的頁面中放置錯誤消息嗎? – 2014-11-14 21:48:02

+0

真的有那麼多人禁用js?我想這讓我很吃驚。 – 2014-11-14 21:49:04

+0

在許多環境中,JS被認爲是一個安全問題,特別是在工作中。 – JohnKiller 2014-11-14 21:50:06