5

在使用JS發送到帶有JS或服務器端的服務器之前驗證用戶輸入是否更好?或者,爲了安全起見,做這兩件事值得嗎?用戶輸入驗證,客戶端或服務器端? [PHP/JS]

我正在創建一個網站(目前非常簡單),它具有成員區域/管理區域等。目前我只有用戶輸入用戶名和密碼,將來會有更多(電子郵件,地址等),但檢查數據的最佳做法是什麼?

我是否在它上面加載了'if ... else'語句,直到用戶獲得正確的語句爲止?或者可能爲用戶輸入的每個值分別設置變量,並將其設置爲true或false,如果它是正確的或錯誤的? (如電子郵件驗證,以確保它是電子郵件格式)

有很多方法可以做到這一點,但你會建議哪些?我不想寫50行代碼,當我可以做10行的工作......如果這是有道理的:p

任何幫助將不勝感激,謝謝! :)

回答

8

服務器端驗證是必須,客戶端驗證是

如果你只使用客戶端驗證,惡意的人會破解你的系統發佈未經驗證的東西 - 破壞你的腳本,並可能利用你的系統。從安全角度來看,這是非常差

也就是說,您還應該包含客戶端驗證,因爲這比往返服務器的速度快得多,並且可以爲用戶提供即時反饋。這會讓用戶滿意,並讓他們回到您的網站。

因此,如果可能的話,同時使用。如果你不能/不會,那麼至少在服務器端做它。僅客戶端驗證是災難的祕訣!

5

兩者兼而有之。

客戶端提供用戶期望的響應能力,服務器端保護您的數據。

我相信PHP有一些庫,它可以幫助你很像ASP.NET MVC提供的一種方法。

4

出於安全原因,輸入驗證肯定應該發生在服務器端。

但是,爲避免向服務器發送無效數據請求並將響應發送回客戶端,最好還要進行客戶端驗證。這將使您的網站更具響應能力。所以添加客戶端驗證用戶友好。

0

驗證,總是服務器端。我可以篡改你的表單客戶端並填寫瘋狂的值,並且仍然得到驗證。我不能篡改服務器端腳本。

因此,當檢查客戶端時,你只是在與服務器「交談」時節省一點時間。切勿用它來真實驗證您的數據。

+2

讓我wounder你爲了生活做什麼;)我理解你的話,儘管如此,我最好確認我在網站發佈之前驗證了所有內容我現在然後 – Shogun 2012-01-09 21:26:31

0

當然,你不能只依靠JavaScript,如果有人禁用了它,該怎麼辦?JavaScript只是爲了讓用戶對用戶更友好,並且每次他犯了錯誤,他都不必等待服務器。服務器端是你自己使用的,以免你的系統出現錯誤!

0

您應該在服務器端進行驗證。客戶端驗證是可選的。 您可以聲明字段的驗證類型,併爲您的表單構建通用驗證器。如果您不知道我的意思,請嘗試查看AngularJs聲明性代碼構建。這是構建表單的最佳方式,Angular也是構建表單的好且快速的框架。

http://angularjs.org/

http://docs.angularjs.org/#!/cookbook/advancedform

看這行:

<input type="text" name="form.address.line1" size="33" ng:required/> <br/> 
    <input type="text" name="form.address.city" size="12" ng:required/>, 
    <input type="text" name="form.address.state" size="2" ng:required ng:validate="regexp:state"/> 
    <input type="text" name="form.address.zip" size="5" ng:required 
    validate="regexp:zip"/> 

對於服務器端,你也可以定義一些結構,其中將包含表單域,驗證方法和錯誤字符串每個領域。然後在循環中,根據您的信息結構驗證每個字段。您可以輕鬆管理這種方式構建的表單。

實施例在PHP:

表格數據:

$formData = array (
    array(
    'ID' => "name", 
    'validate' => '/.+/', 
    'label' => 'Your name', 
    'errorMsg' => "This field is required", 
    'type' => 'text' 
    ), 
array(
     'ID' => "Phone number", 
     'validate' => '/^[0-9+ ]+$/', 
     'label' => 'Numer telefonu', 
     'errorMsg' => "Please provide proper telephone number", 
     'type' => 'text' 
     ) 
); 

驗證和形式發生器(抱歉簡單和雜亂代碼在這裏):

$s = ''; 
foreach ($formData as $input){ 
    $s .= sprintf('<label for="%s">%s</label>',$input['ID'],$input['label']); 
    if (isset($_POST[$input['ID']]) && !empty($input['validate']) && !preg_match($input['validate'],$_POST[$input['ID']])){ 
     $error = true; 
     $s .= sprintf('<div class="formErrorValidate">%s</div>',$input['errorMsg']); 
    } 
    if (isset($_POST[$input['ID']])) $htmlMsg = str_replace('%'.$input['ID'].'%',$_POST[$input['ID']],$htmlMsg); 
    if ($input['type'] == 'textarea'){ 
     $s .= sprintf('<textarea name="%s" id="%s">%s</textarea>',$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:'')); 
    } else { 
     $s .= sprintf('<input type="%s" name="%s" id="%s" value="%s"/>',$input['type'],$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:'')); 
    } 

}

+0

我從來沒有真的想過這樣做,它似乎是一個非常簡單的方式來生成和驗證窗體,感謝回覆:) – Shogun 2012-01-09 21:23:29