2012-02-03 83 views
5

tôi có một hình thức đăng nhập:cách chuyển hướng trang sang https bằng php?

<form method =POST action="/login.php"> 
... 
</form> 

tôi muốn trang login.php để chuyển hướng đến sử dụng https.

tôi không muốn gửi người dùng đến https://.../login.php vì họ có thể thay đổi liên kết. nhưng tôi muốn làm một chuyển hướng về phía máy chủ trước khi tôi phân tích các dữ liệu mẫu đăng nhập và đăng nhập người sử dụng trong

tôi tìm thấy và ví dụ:.

if($_SERVER["HTTPS"] != "on") { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]); 
    exit(); 
} 

nhưng tôi không có $_SERVER["HTTPS"] nếu tôi var_dump($_SERVER);

tôi có $_SERVER['SERVER_PORT'] phù thủy là 80.

bất kỳ ý tưởng nào?

Cảm ơn

+0

"tôi không muốn gửi cho người dùng ..." "tôi muốn làm một chuyển hướng "Cả hai đều không tương thích lẫn nhau. Bạn có muốn buộc người dùng sử dụng SSL không? Nếu vậy, bạn cần chuyển hướng (gửi) người dùng đến phiên bản HTTPS của biểu mẫu đăng nhập. –

+0

'nhưng tôi không có' tất nhiên bạn sẽ không có nó khi bạn kết nối với thường xuyên 'HTTP'. Và cổng 80 nói như vậy. '$ _SERVER [" HTTPS "] = 'on';' khi bạn được kết nối thông qua HTTPS và cổng của bạn trong trường hợp đó sẽ là '443'. Bạn kịch bản đang làm điều đúng, nó kiểm tra xem kết nối hiện tại là HTTP và nếu nó không phải là - nó chuyển hướng đến phiên bản HTTPS. – Cheery

+0

tôi có thể, nhưng có khả năng người dùng thay đổi liên kết thành HTTP. Tôi cần thực hiện kiểm tra trên trang login.php cho HTTPS – Patrioticcow

Trả lời

6

Nếu bạn cho phép họ gửi đến /login.php qua HTTP đơn giản và sau đó chuyển hướng đến HTTPS, bạn đánh bại mục đích của việc sử dụng HTTPS vì thông tin đăng nhập đã được gửi trong văn bản đơn giản trên internet .

Bạn có thể làm gì để ngăn người dùng thay đổi URL, làm cho trang đăng nhập từ chối đăng nhập nếu nó không qua HTTPS.

gì tôi sử dụng để kiểm tra việc sử dụng HTTPS như sau:

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { 
    // request is not using SSL, redirect to https, or fail 
} 

Nếu bạn đang chạy máy chủ bảo mật của bạn trên cổng mặc định của 443, sau đó bạn cũng có thể kiểm tra xem nếu đó là cổng, nhưng PHP đặt giá trị $_SERVER['HTTPS'] thành không trống nếu SSL được sử dụng vì vậy tôi sẽ kiểm tra sự hiện diện của điều đó để thực hành tốt nhất.

EDIT:

Nếu người dùng đang rất bao gồm để tự thay đổi https http và muốn gửi thông tin của mình trên văn bản đơn giản, không có bất cứ điều gì bạn có thể làm để ngăn chặn chúng, nhưng nếu bạn không cho phép đăng nhập qua HTTP, vì vậy ngay cả thông tin chính xác cũng sẽ không đăng nhập chúng, bạn có thể buộc chúng sử dụng https bằng cách làm cho nó trở thành thứ duy nhất hoạt động.

+0

Có, thêm kiểm tra đó vào login.php ở gần đầu tập lệnh. Bạn có thể thực hiện một số việc, từ chối từ chối thông tin đăng nhập với lỗi nói https là bắt buộc hoặc sử dụng tiêu đề 301 để chuyển hướng đến https. – drew010

5

Dù trang web mà bạn sử dụng để hiển thị hình thức đăng nhập của bạn nên đã được sử dụng https://trước dạng được điền, và sau đó nó phải được nộp đến địa chỉ khác https://. Nếu không, bạn sẽ để biểu mẫu mở để tấn công.

Bạn có thể xem xét mod_rewrite để tự động chuyển hướng bất kỳ yêu cầu nào bằng cách sử dụng http:// đến https://, ít nhất là cho trang đăng nhập của bạn.

+0

Miễn là biểu mẫu được đăng lên https, không quan trọng nếu bản thân biểu mẫu có trên trang không phải https không. – drew010

+0

@ drew010: http://security.stackexchange.com/questions/1692/is-posting-from-http-to-https-a-bad-practice – Crontab

+0

Đúng html của trang đích có thể được sửa đổi bởi một người đàn ông-in- giữa chừng, nhưng dữ liệu sẽ vẫn được mã hóa nếu nó được đăng lên một trang HTTPS. Để thực hành tốt nhất, tôi thường buộc toàn bộ trang web sử dụng SSL và không chỉ các trang cụ thể. Theo hướng dẫn đó, bạn cũng nên tạo biểu mẫu đăng nhập của mình trên https. – drew010

3

Giả sử rằng trang của bạn có biểu mẫu đăng nhập được tạo bởi index.php, bạn cần phải đặt mã mẫu cho chuyển hướng HTTP sang HTTPS trong index.php. Điều này sẽ đảm bảo rằng khi người dùng điền vào biểu mẫu và gửi biểu mẫu, nó được gửi đến /login.php qua HTTPS chứ không phải HTTP.

Đặt séc này bên trong login.php là vô ích bởi vì thời gian login.php nhận yêu cầu và cố gắng chuyển hướng đến URL HTTPS tương ứng, thông tin đăng nhập đã được gửi đến dưới dạng văn bản thuần túy, đó là điều bạn nên tránh.

Các quan sát mà bạn nhìn thấy $_SERVER['SERVER_PORT']80$_SERVER["HTTPS"] được không được thiết lập khi bạn đặt việc kiểm tra bên trong login.php là một bằng chứng nữa về thực tế là thông tin đăng nhập sẽ được gửi đến nó thông qua HTTP và do đó các thông tin đăng nhập được đạt máy chủ của bạn từ máy khách không được mã hóa. Điều này phải được tránh bằng cách làm theo những gì tôi đã nói trong đoạn đầu tiên của câu trả lời này.

BTW, tôi sẽ không sử dụng PHP để thực hiện loại chuyển hướng này. Các chuyển hướng như vậy được xử lý rất thuận tiện bởi mod_rewrite trong Apache HTTPD.

Một ví dụ, giả định rằng trang đăng nhập của bạn có sẵn tại địa chỉ URL, http://example.com/foo/:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
5
if($requireSSL && $_SERVER['SERVER_PORT'] != 443) { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
    exit(); 
} 
Các vấn đề liên quan