2012-04-15 37 views
17

Tôi chủ yếu là một lập trình viên C++, nhưng tôi đang cố gắng lấy một số PHP.Phiên PHP an toàn như thế nào?

Dường như cách để triển khai phiên người dùng web là lưu trữ ID đăng nhập của người dùng trong cookie bằng biến $ _SESSION.

Không thể ai đó chỉ sửa đổi cookie của họ, để cung cấp cho họ các đặc quyền khác nhau hoặc đăng nhập với tư cách người dùng khác?

Dường như cơ chế xác thực này chỉ cho phép người dùng lưu trữ ID của họ trong một tệp - và sau đó chỉ tin tưởng họ không thay đổi nó.

Có điều gì đó ngăn điều này không?

Cảm ơn!

+1

có toàn bộ sách về chủ đề này. –

+1

http://phpsec.org/projects/guide/4.html, http://stackoverflow.com/questions/3641958/secure-sessions-cookies-in-php, http://stackoverflow.com/questions/5608764/mục đích-của-php-phiên-và-cookie-và-sự khác biệt của họ, http://stackoverflow.com/questions/4110986/new-to-php-logins-and-sessions-is-this-safe-enough , http://stackoverflow.com/questions/1181105/how-safe-are-php-session-variables – bostaf

+1

Bản sao có thể có của [Biến an toàn PHP là biến an toàn như thế nào?] (http://stackoverflow.com/questions/1181105/ làm thế nào-an toàn-là-php-phiên-biến) –

Trả lời

8

Không, phiên được lưu trữ trên máy chủ và người dùng không thể truy cập. Nó được sử dụng để lưu trữ thông tin trên trang web như các phiên đăng nhập.

Dưới đây là một ví dụ về việc sử dụng:

<?php 
session_start(); 
if ($_POST['password'] == "1234") 
$_SESSION['auth'] = true; 
?> 

Các phiên sau đó có thể được truy cập qua trang web để kiểm tra xem nếu người dùng đã được chứng thực.

<?php 
session_start(); 
if ($_SESSION['auth'] == true) { 
    echo "You are logged in!"; 
} 
?> 

Người dùng không thể chỉnh sửa các giá trị này tuy nhiên ID của phiên được lưu trữ trên máy tính thông qua cookie dưới dạng chuỗi dài ngẫu nhiên. Nếu người dùng không được phép truy cập vào các chuỗi này, họ có thể truy cập trang web đó.

+0

Vì vậy, dữ liệu phiên được lưu trữ trên máy chủ. Đó là nơi tôi đã đi sai .. Cảm ơn – James

+3

@ James, thông tin * phiên * không được lưu trữ công khai, nhưng ID phiên * ** là **. Có biện pháp phòng ngừa bổ sung cần được thực hiện để ngăn chặn điều này xảy ra. Xem câu trả lời của tôi. – 0b10011

+0

Bây giờ cả hai bạn có thể hiểu nó tốt hơn vì vào tháng 10 năm 2016, và câu hỏi đã được hỏi và hoạt động cách đây gần 4 năm kể từ bây giờ. Những gì tôi có nghĩa là câu trả lời này là ngoài sai từ khía cạnh an ninh. – MNR

3

Nếu làm được điều này:

$_SESSION['user'] = $username; 

Sau đó $username sẽ không được lưu trữ trực tiếp trong một cookie. Thay vào đó, một id phiên duy nhất sẽ được tạo và lưu trữ bên trong một cookie.

Thông tin mà bạn lưu trữ trong $_SESSION chỉ được lưu trữ phía máy chủ và không bao giờ được gửi cho khách hàng. Theo yêu cầu tiếp theo của khách hàng, máy chủ sẽ tải dữ liệu phiên theo id được lưu trữ trong cookie khi bạn thực hiện session_start().

Nó tương đối an toàn. Điều duy nhất có thể xảy ra là ai đó có thể chặn id phiên và do đó đánh cắp phiên người dùng thực. HTTPS có thể ngăn chặn điều đó xảy ra.

+0

Trên thực tế, HTTPS chỉ làm cho nó không thể đọc Cookie khi nó được gửi cho người dùng. Tuy nhiên, nếu kẻ tấn công bằng cách nào đó đi kèm với giá trị phiên, sau đó họ được truy cập. – 0b10011

5

Trả lời câu hỏi này cần 2 phương pháp:

  1. PHP session IDs là đủ khó để đoán cho hầu hết các trường hợp sử dụng. Không khó hơn hoặc ít khó hơn các hệ thống được sử dụng rộng rãi khác.

  2. Tin tưởng chỉ một cookie phiên (và chỉ tồn tại cookie phiên) dường như không đi xa đến mức bảo mật cho tôi, bất kể cookie phiên này đến từ đâu - PHP hay ở nơi khác.

Vì vậy, trong ngắn hạn, các phiên PHP an toàn khi bạn sử dụng chúng. Điều này đúng với bất kỳ hệ thống dựa trên phiên làm việc nào mà tôi biết.

24

Phiên PHP chỉ an toàn khi ứng dụng của bạn tạo ra chúng.Các phiên PHP sẽ cung cấp cho người dùng một chuỗi giả ("ID phiên") để họ tự xác định, nhưng nếu chuỗi đó bị chặn bởi kẻ tấn công, kẻ tấn công có thể giả vờ là người dùng đó.

Phải làm gì

Thông tin này được lấy từ "Session Management Basics" in the PHP manual, nhưng đơn giản hóa một chút. Một số điều có thể đã bị bỏ qua. Hãy chắc chắn để đọc thông qua đó là tốt.

  1. Always use HTTPS

    • Ngăn chặn những kẻ tấn công từ việc đọc các cookie phiên ID
  2. Enable session.use_strict_mode:

    • Rejects uninitialized session IDs
    • Đảm bảo bất kỳ phiên tạo ra là thực sự có giá trị, vì vậy bạn có thể tin tưởng một prefix (ví dụ, nếu tiền tố là $userId-)
  3. Enable sessions.use_only_cookies và vô hiệu hóa session.use_trans_sid

    • Tránh sử dụng phiên chia sẻ ID vô tình bằng cách chia sẻ một URL có ID phiên trong đó
    • Ngăn ID phiên xuất hiện trong một tiêu đề Referer
  4. kỳ regenerate the session IDinvalidate old session IDs shortly after regenerating

    • Nếu kẻ tấn công sử dụng session ID của người dùng khác, tái tạo sẽ làm mất hiệu lực hoặc phiên tấn công của, tùy thuộc vào người dùng hoặc thực hiện yêu cầu đó tái tạo ID. Sau đó, bạn có thể theo dõi khi ai đó cố gắng sử dụng phiên đã được tạo lại và làm mất hiệu lực phiên được tạo lại tại thời điểm đó. Người dùng sẽ có thể đăng nhập, nhưng kẻ tấn công (hy vọng) sẽ không thể.
  5. tùy ý theo dõi thông tin bổ sung trong $_SESSION có liên quan đến yêu cầu (địa chỉ IP, sử dụng chuỗi đại lý, vv)

    • Nếu kẻ tấn công bằng cách nào đó giành quyền truy cập vào một session ID, điều này có thể phát hiện xâm nhập trước khi kẻ tấn công có thể truy cập bất kỳ dữ liệu nào. Tuy nhiên, hãy nhớ rằng điều này có thể làm trầm trọng thêm trải nghiệm người dùng. Ví dụ: địa chỉ IP có thể thay đổi khi người dùng chuyển từ mạng di động sang Wi-Fi và chuỗi tác nhân người dùng có thể thay đổi khi trình duyệt của họ tự động cập nhật. Điều chỉnh dữ liệu được kiểm tra theo sự cân bằng mà trang web của bạn sẵn sàng giải quyết.
+0

Câu trả lời hay, nhưng như đã nói trên [một câu hỏi khác] (https://stackoverflow.com/questions/1181105/how-safe-are-php-session-variables) * (chấp nhận câu trả lời, đoạn thứ 3) *, có thể có một vấn đề về khả năng sử dụng với phương pháp * theo dõi IP *, phải không? – AymDev

+2

@AymDev Thật không may, có. IP có thể thay đổi do chuyển từ LTE sang WiFi. Phiên bản trình duyệt có thể thay đổi với bản cập nhật tự động. Tôi đã cập nhật câu trả lời với một lưu ý về điều đó và thêm một số khuyến nghị bổ sung (và tốt hơn) để đảm bảo các phiên PHP. – 0b10011

1

Dù câu trả lời bạn nhận được về chủ đề này, bạn có nhiều khả năng sẽ không được hài lòng bởi vì có rất nhiều ý kiến ​​khác nhau về chủ đề này. Thậm chí còn có toàn bộ sách được viết về các phiên và bảo mật PHP nói chung.

Câu trả lời hay nhất mà bạn có thể hy vọng nhận được ở đây có thể là "phiên an toàn như bạn muốn chúng". Công việc nhiều hơn và một số lượng lớn các biện pháp phòng ngừa rõ ràng sẽ làm cho chúng an toàn hơn để sử dụng nhưng bản thân việc triển khai sẽ tốn nhiều thời gian hơn. Như với tất cả mọi thứ bạn là người để đo lường bao nhiêu an toàn là đủ an toàn cho nhu cầu của bạn.

0

Vì bạn là lập trình viên C++, bạn chỉ cần biết rằng phiên có thể nhìn thấy phía máy khách chỉ là một con trỏ trên không gian địa chỉ khác (máy chủ) và, do đó, phiên không thể truy cập được từ chế độ máy khách .

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