5

Có tốt hơn để xác thực đầu vào của người dùng trước khi nó được gửi đến máy chủ với JS hoặc phía máy chủ với PHP không? Hoặc có lẽ nó đáng làm cả hai chỉ để được ở bên an toàn?Xác thực nhập của người dùng, phía máy khách hoặc phía máy chủ? [PHP/JS]

Tôi đang tạo trang web (rất đơn giản tại thời điểm này) có khu vực thành viên/khu vực quản trị/v.v. Tại thời điểm này tôi chỉ có đầu vào người dùng của Tên người dùng và Mật khẩu, trong tương lai sẽ có nhiều hơn (email, địa chỉ, vv), nhưng whats thực hành tốt nhất của việc kiểm tra dữ liệu?

Tôi có tải một câu lệnh 'if ... else' vào nó cho đến khi người dùng nhận được đúng không? Hoặc có thể có các biến riêng biệt cho mỗi giá trị được người dùng nhập và đặt thành giá trị đúng hoặc sai nếu đúng hoặc sai? (như xác nhận e-mail để đảm bảo định dạng email)

Có nhiều cách để thực hiện, nhưng bạn nên đề xuất phương thức nào? Tôi không muốn viết 50 dòng mã khi tôi có thể thực hiện công việc trong 10 dòng ... nếu điều đó có ý nghĩa: p

Mọi trợ giúp sẽ được đánh giá cao, cảm ơn! :)

Trả lời

8

Xác thực phía máy chủ là phải, xác thực phía máy khách là cộng.

Nếu bạn chỉ sử dụng xác thực phía máy khách, những người bất chính sẽ tấn công hệ thống của bạn để đăng nội dung chưa được xác thực - vi phạm tập lệnh của bạn và khai thác hệ thống của bạn. Đây là rất xấu từ quan điểm bảo mật.

Điều đó nói rằng, bạn cũng nên bao gồm xác thực phía máy khách, vì đó là nhanh hơn nhiều so với một chuyến đi vòng đến máy chủ và cung cấp cho người dùng phản hồi tức thì của bạn. Điều này sẽ giúp người dùng của bạn hài lòng và sẽ đưa họ quay trở lại trang web của bạn.

Vì vậy, nếu có thể, hãy sử dụng cả hai. Nếu bạn không thể/sẽ không, sau đó ít nhất là làm nó phía máy chủ. Xác thực chỉ phía máy khách là một công thức cho thảm họa!

5

Thực hiện cả hai.

Phía máy khách cung cấp cho người dùng khả năng phản hồi và phía máy chủ bảo vệ dữ liệu của bạn.

Tôi chắc rằng PHP có một số thư viện sẽ giúp bạn nhiều như những gì ASP.NET MVC làm để cung cấp một cách để làm cả hai trong một bước.

4

Xác thực nhập phải chắc chắn xảy ra ở phía máy chủ vì lý do an toàn.

Tuy nhiên, để tránh gửi yêu cầu tới máy chủ có dữ liệu không hợp lệ và gửi phản hồi lại cho máy khách, bạn cũng nên có xác thực phía máy khách. Điều này sẽ làm cho trang web của bạn phản hồi nhanh hơn. Vì vậy, hãy thêm xác thực phía máy khách để thân thiện với người dùng.

0

Xác thực, bên máy chủ LUÔN. Tôi có thể giả mạo với hình thức phía máy khách của bạn và điền vào các giá trị điên rồ và vẫn được xác nhận. Tôi không thể giả mạo các tập lệnh phía máy chủ.

Vì vậy, khi kiểm tra phía máy khách, bạn chỉ cần tiết kiệm một chút thời gian 'nói chuyện' với máy chủ. Không bao giờ sử dụng nó để xác thực dữ liệu của bạn cho thực.

+2

Làm cho tôi wounder những gì bạn làm cho một cuộc sống;) tôi hiểu những gì nói của bạn mặc dù, tôi tốt hơn chắc chắn rằng tôi xác nhận tất cả mọi thứ trước khi trang web đi l ive bây giờ sau đó – Shogun

0

Tất nhiên bạn không thể chỉ dựa vào JavaScript, nếu ai đó bị vô hiệu hóa thì sao?JavaScript chỉ làm cho trang web thân thiện với người dùng hơn đối với người dùng và rằng anh ta không phải đợi máy chủ mỗi khi anh ấy nhầm lẫn. Phía máy chủ là dành cho bạn sử dụng riêng để không có lỗi trên hệ thống của bạn!

0

Bạn nên xác thực điều này ở phía máy chủ. Xác nhận phía máy khách là tùy chọn. Bạn có thể khai báo các loại xác thực cho các trường và xây dựng trình xác nhận chung cho các biểu mẫu của mình. Nếu bạn không biết những gì tôi có nghĩa là hãy thử nhìn vào AngularJs xây dựng mã khai báo. Đó là cách tốt nhất để xây dựng các biểu mẫu, còn Angular là khung công tác tốt và rất nhanh để xây dựng các biểu mẫu.

http://angularjs.org/

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

Nhìn vào dòng này:

<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"/> 

Đối với phía máy chủ của bạn, bạn cũng có thể xác định một số cấu trúc, mà sẽ chứa các lĩnh vực hình thức, phương pháp xác nhận, và chuỗi lỗi cho mỗi trường. Sau đó, trong vòng lặp, xác nhận từng trường dựa trên cấu trúc thông tin của bạn. Bạn có thể dễ dàng quản lý các biểu mẫu được xây dựng theo cách đó.

Ví dụ trong PHP:

dữ liệu mẫu:

$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' 
     ) 
); 

Validator và phát biểu mẫu (xin lỗi vì mã đơn giản và lộn xộn ở đây):

$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

Tôi đã không bao giờ thực sự nghĩ về cách làm theo cách này, nó có vẻ là một cách rất đơn giản của việc tạo ra và xác nhận một hình thức, nhờ trả lời :) – Shogun

Các vấn đề liên quan