2008-08-10 36 views
15

Tôi đã sử dụng PHP và JavaScript để xây dựng trang web của cha tôi. Anh ấy muốn kết hợp một hệ thống đăng nhập vào trang web của mình và tôi có thiết kế cho hệ thống bằng cách sử dụng PHP. Vấn đề của tôi là làm thế nào để hiển thị nút nếu người đó được ghi lại trongKịch bản đăng nhập với các nút ẩn

Ví dụ - Bạn có Home, Sản phẩm, Giới thiệu, và Liên. Tôi muốn có các nút cho Đại lý, phân phối, và các thông tin có thể khác nếu người dùng đang đăng nhập. Vì vậy, tôi sẽ phải Home, Sản phẩm, Giới thiệu, Liên hệ, Đại lý (nếu đại lý đăng nhập), Nhà phân phối (nếu đăng nhập nhà phân phối), v.v.

JavaScript có phải là cách hay để thực hiện điều này hoặc PHP, hoặc thậm chí cả hai? Sử dụng JavaScript để hiển thị và ẩn các nút và PHP để kiểm tra xem các nút nào sẽ hiển thị hay không.

Trả lời

18

Về an ninh, bạn không thể tin tưởng những gì xuất phát từ khách hàng:

  • Các du khách có thể nhìn thấy tất cả các mã của bạn (HTML và Javascript, không PHP) và cố gắng thứ
  • Các khách truy cập có thể thậm chí không sử dụng một trình duyệt; thật dễ dàng gửi yêu cầu bằng một tập lệnh

Điều này có nghĩa là ẩn các nút là thiết kế Giao diện người dùng tốt (vì bạn không thể sử dụng chúng nếu bạn chưa đăng nhập). Nhưng nó không phải là một tính năng bảo mật. Tính năng bảo mật đang kiểm tra, trên máy chủ, rằng khách truy cập đã đăng nhập trước mỗi hành động yêu cầu nó.

Nếu bạn không có ý định hiển thị các nút, sẽ không hữu ích khi gửi HTML và hình ảnh tới trình duyệt và sau đó ẩn chúng bằng Javascript. Tôi sẽ kiểm tra với PHP.

2

Nếu bạn sử dụng javascript để ẩn các nút, bạn mở lỗ hổng bảo mật trong ứng dụng. Một người dùng độc hại có thể vô hiệu hóa javascript hoặc áp dụng một số của riêng họ để có được xung quanh bảo mật của bạn.

Tôi khuyên bạn nên sử dụng PHP để chọn hiển thị các nút hay không. Tôi làm điều này trong .NET khá thường xuyên.

Bạn sẽ có thể kiểm tra quyền truy cập của người dùng ở phía máy chủ bất cứ khi nào họ cũng cố sử dụng nút bị hạn chế.

1

gì chúng tôi đã thực hiện tại công việc của tôi là có một thư viện cung cấp các chức năng như kiểm tra nếu người dùng đang đăng nhập Ví dụ:.

<?php 
require_once 'Auth.php'; 
// output some html 
if (isLoggedIn()) { 
    echo 'html for logged in user'; 
} 
// rest of html 

Đối với các trang mà chỉ authenicated người dùng sẽ thấy, kiểm tra bộ điều khiển nếu họ đăng nhập và nếu không thì họ sẽ chuyển hướng họ đến trang đăng nhập.

<?php 
public function viewCustomer($customerId) { 
    if (!isLoggedIn()) 
     redirectToLoginPage(); 
} 
8

Trong menu file của bạn hoặc w/e bạn đặt:

<? require 'auth.php' ?> 
<ul> 
    <li><a href="">Home</a></li> 
    <li><a href="">Products</a></li> 
    <? if(loggedin()): ?><li><a href="">Secret area</a></li><? endif; ?> 
</ul> 

Sau đó, trong trang yêu cầu auth chỉ làm điều này:

<?php 
    require 'auth.php'; 
    require_login(); 
?> 

đâu auth.php có thể chứa:

<?php 
    function loggedin(){ 
     return isset($_SESSION['loggedin']); 
    } 

    function require_login(){ 
     if(!loggedin()){ 
      header('Location: /login.php?referrer='.$_SERVER['REQUEST_URI']); 
      exit; 
     } 
    } 
?> 
+1

Tóm lại những gì đã trình bày ở trên: bạn sẽ kiểm tra xem nếu họ đăng nhập, nếu có, bạn sẽ hiển thị các nút/liên kết mà bạn chỉ muốn đăng nhập thành viên để xem. – Brad

1

Mọi thứ mà Christian Lescuyer viết là chính xác . Tuy nhiên, lưu ý rằng anh ta nói "Tôi sẽ" và không "bạn nên". Sự lựa chọn không phải là dễ dàng.

Trước hết, bảo mật không phải là vấn đề trong lựa chọn. Bạn nên có kiểm tra bảo mật trên máy chủ khi bạn thực hiện một hành động. Mã nào quyết định hiển thị/ẩn nút dẫn đến hành động không liên quan.

Điều đó khiến chúng tôi chỉ có một nhược điểm khi hiển thị/ẩn logic trong Javascript - HTML được gửi tới người dùng lớn hơn mức cần thiết. Đây có thể không phải là một vấn đề lớn.

Có hiển thị/ẩn logic trong PHP không có dấu trừ. Mã PHP yêu cầu thường là tag soup. Mã của Akira cung cấp một ví dụ điển hình về cách nó thường được thực hiện.

Tương ứng với mã Javascript có lẽ sẽ giống như thế này:

if (logged()) 
{ 
    elementSecretArea.style.display = "list-item"; 
} 

(giả định rằng yếu tố có thể được ẩn có display: none theo mặc định).

Kiểu này cũng cho phép kịch bản "Ajax" đẹp: người dùng thấy trang w/o khu vực bí mật, nhập mật khẩu, xem khu vực bí mật mà không cần làm mới trang.

Vì vậy, nếu bạn đã có một tập lệnh chạy khi tài liệu của bạn tải vì các lý do khác, tôi sẽ nghiêm túc xem xét việc hiển thị/ẩn logic ở đó.

0

Về cơ bản, nơi bạn có thực đơn của bạn trong html, nói như một danh sách <ul> <li>Home</li> </ul> bạn thêm php sau </li> của mục cuối cùng:

<?php 
    if($session-logged_in) {  
?> 

<li>My Account</li> 

<?php 
    } 
?> 
Các vấn đề liên quan