Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Nhiều lần cần xác thực cả máy khách và máy chủ. Công cụ này làm cho nó trở nên dễ dàng và bạn không bị ràng buộc với bất kỳ khung phía máy chủ cụ thể nào

Phiếu đăng ký mẫu

Nhập các giá trị xấu rồi nhấn nút gửi

Gửi biểu mẫu Đặt lại

bản trình diễn độc lập

Ở đây, chúng tôi thêm phần thiết lập tối thiểu của mình với một số xác thực phía máy chủ. Trên máy chủ, chúng tôi đã xác định rằng các trường tên và tuổi không bao giờ hợp lệ

mã hóa JavaScript

Đây là cách chúng tôi làm điều đó. Trước tiên, chúng tôi khởi tạo xác thực phía máy khách bằng lệnh gọi trình xác nhận () và quảng cáo logic gửi biểu mẫu tùy chỉnh sau đó. Bạn có thể sử dụng phương thức isDefaultPrevented() trên đối tượng Sự kiện jQuery để kiểm tra xem xác thực phía máy khách có được thông qua hay không

// initialize validator and add a custom form submission logic
$("#myform").validator().submit(function(e) {

var form = $(this);

// client-side validation OK.
if (!e.isDefaultPrevented()) {

// submit with AJAX
$.getJSON("server-fail.js?" + form.serialize(), function(json) {

// everything is ok. (server returned true)
if (json === true) {
form.load("success.php");

// server-side validation failed. use invalidate() to show errors
} else {
form.data("validator").invalidate(json);
}
});

// prevent default form submission logic
e.preventDefault();
}
});


JavaScript

Ở đây chúng tôi đã sử dụng một giá trị trả về đơn giản là true để chỉ ra rằng dữ liệu hợp lệ ở phía máy chủ. Bạn có thể làm bất cứ điều gì bạn muốn khi dữ liệu tốt. Ở đây chúng tôi đã thay thế nội dung biểu mẫu bằng trang phía máy chủ. Nếu dữ liệu không hợp lệ, chúng tôi sử dụng phương thức không hợp lệ để hiển thị lỗi cho người dùng. Phương thức không hợp lệ chấp nhận một đối số đối tượng là tên trường bị lỗi. Máy chủ thất bại. js là "logic" phía máy chủ của chúng tôi và nó luôn trả về như sau

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Bạn cần đặt khối tập lệnh sau mã HTML hoặc bạn có thể sử dụng cách khác $(document) của jQuery. sẵn sàng thực thi tập lệnh ngay khi Mô hình đối tượng tài liệu (DOM) của trang web được tải. Đọc thêm về điều đó từ Hướng dẫn sử dụng

Câu hỏi liệu xác thực đầu vào nên được thực hiện ở phía máy khách hay phía máy chủ là câu hỏi đã được tranh luận hết lần này đến lần khác. Cả hai phương pháp đều có ưu và nhược điểm, và cuối cùng quyết định sử dụng phương pháp nào phụ thuộc vào tình huống cụ thể. Khi các ứng dụng web được phát triển, đầu vào nhận được từ máy khách thường được lưu trữ hoặc phản ánh lại cho người dùng. Sau đó, khi ý nghĩa bảo mật được phát hiện, người ta hiểu rằng đầu vào cần được xác thực. Sau đó, các nhà phát triển được khuyên nên hạn chế hoặc làm sạch đầu vào của người dùng

Trong khi một số nhà phát triển chỉ xác thực ở phía máy khách (e. g. , JavaScript), một số chỉ xác thực ở phía máy chủ, trong khi một số khác xác thực trên cả hai. Dưới đây sẽ chia nhỏ từng loại để bạn hiểu tầm quan trọng của nó

Xác thực đầu vào ở phía máy khách

Xác thực phía máy khách được hiển thị cho người dùng. Nó liên quan đến việc xác thực trên các biểu mẫu đầu vào thông qua JavaScript. Ví dụ: nếu đầu vào được gửi cho số điện thoại hoặc email, trình xác thực JavaScript sẽ báo lỗi nếu bất kỳ thứ gì được gửi không phù hợp với số điện thoại hoặc email. Ví dụ, bên dưới chúng ta sẽ xem cách có thể dễ dàng thay đổi các hạn chế phía máy khách

Biểu mẫu sau sẽ chỉ được gửi nếu cụm từ “thành công” được gửi

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 1. Xác thực đầu vào phía máy khách, Giai đoạn 1

Tuy nhiên, một lỗi mã thông báo được hiển thị khi "thành công" được gửi

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 2. Xác thực đầu vào phía máy khách, Giai đoạn 2

Điều này có nghĩa là yêu cầu đang gửi mã thông báo ngoài cụm từ. Để xem những gì đang được thực hiện, chúng ta có thể xem xét yêu cầu bằng proxy chặn (chẳng hạn như Burp Proxy)

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 3. Xác thực đầu vào phía máy khách, Giai đoạn 3

Bây giờ chúng tôi đã xác nhận những nghi ngờ của mình, chúng tôi cần hiểu những gì đang được sử dụng để tạo mã thông báo. Do JavaScript được cung cấp cho chúng tôi để điền vào trang, chúng tôi có thể dễ dàng xem mã

function rot13(inp) { return inp.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}); } function generate_token() { var phrase = document.getElementById("phrase").value; document.getElementById("token").value = md5(rot13(phrase)); } generate_token();

Đoạn mã trên sẽ lấy cụm từ từ hộp nhập, chạy nó thông qua một mật mã thay thế đơn giản (rot13) và sau đó md5 nó. Chúng tôi có thể xác nhận điều này bằng cách lấy cụm từ “ChangeMe” và chạy nó thông qua thay thế rot13 sẽ hiển thị cho chúng tôi “PunatrZr”. Hàm băm của “PunatrZr” là 8b479aefbd90795395b3e7089ae0dc09, khớp với mã thông báo trong yêu cầu ở trên

Nếu cụm từ “success” được gửi thành công, chúng tôi sẽ cần thực hiện các bước tương tự như chúng tôi đã làm cho “ChangeMe”

  • Rot13 của “success” trở thành “fhpprff”

  • Md5 của “fhpprff” là 38581812b435834ebf84ebcc2c6424d6

Bước tiếp theo sẽ là chặn yêu cầu trước khi nó được gửi đến máy chủ và sửa đổi mã thông báo thành 38581812b435834ebf84ebcc2c6424d6

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

hinh 4. Xác thực đầu vào phía máy khách, Giai đoạn 4

Sau khi gửi, chúng tôi sẽ nhận được xác nhận rằng nó đã thành công

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 5. Xác thực đầu vào phía máy khách, Giai đoạn 5 – Đã bỏ qua

JavaScript phải có thể truy cập được bởi trình duyệt (và do đó là người dùng) để đảm bảo ứng dụng web hoạt động bình thường. Như đã thấy ở trên, bất kỳ hạn chế nào cũng có thể được đảo ngược kỹ thuật nhanh chóng hoặc thậm chí bỏ qua hoàn toàn

Xác thực đầu vào ở phía máy chủ

Xác thực đầu vào phía máy chủ sẽ lấy bất cứ thứ gì được gửi bởi máy khách và tiến hành kiểm tra bổ sung. Sử dụng xác thực phía máy chủ cho biết rằng mọi thông tin đầu vào do người dùng (hoặc máy khách) gửi đều không thể tin cậy được

Để cho thấy mức độ hiệu quả của điều này, biểu mẫu sau đây dễ bị tấn công bởi Cross-Site Scripting

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 6. Xác thực đầu vào phía máy chủ, Giai đoạn 1

Nếu tải trọng JavaScript được gửi, hộp cảnh báo sẽ xuất hiện

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 7. Xác thực đầu vào phía máy chủ, Giai đoạn 2

Điều này ngụ ý rằng yêu cầu đã được gửi đến máy chủ và được phản hồi lại cho máy khách mà không có bất kỳ xác thực nào. Trong các ví dụ này, chúng tôi có quyền truy cập vào mã nguồn cơ bản để xác thực khiếu nại của mình

  • echo ‘

    Hello ‘ . $_GET[ ‘name’ ] . ‘

Có nhiều cách tiếp cận có thể được thực hiện để xác thực từ phía máy chủ và một cách đơn giản có thể là xóa các thẻ JavaScript khi tên được gửi lại cho máy khách

Tải trọng tương tự đã được gửi nhưng bây giờ hộp cảnh báo không được điền

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Chúng tôi có thể xác thực phía máy chủ bằng javascript không?

Hình 8. Xác thực đầu vào phía máy chủ, Giai đoạn 3 – Thất bại

Nhìn vào nguồn, chúng tôi nhận thấy rằng bất kỳ sự hiện diện nào của thẻ script trong biến tên sẽ được thay thế

  • $name = str_replace( ‘