2009-02-20 22 views
26

Theo câu hỏi, là nó an toàn để lưu trữ mật khẩu trên các trang php nhưCó bao giờ ok để lưu trữ mật khẩu trong văn bản thuần túy trong một biến php hoặc liên tục php?

$password = 'pa$$w0rd'; 

Nếu người dùng không thể nhìn thấy nó, nó an toàn, đúng không?

EDIT: Một số người thực sự đề xuất sử dụng băm, tuy nhiên, sẽ có vấn đề với mật khẩu kết nối máy chủ cơ sở dữ liệu, phải không?

Trả lời

31

Câu trả lời ngắn gọn là Không và Phụ thuộc. Hầu như không bao giờ có ý tưởng tốt để lưu trữ mật khẩu ở dạng văn bản thuần túy, đặc biệt là ở một vị trí có thể truy cập web, nếu cho không có lý do khác ngoài cấu hình sai máy chủ đơn giản hoặc tiếng vọng ở sai địa điểm có thể phơi bày mật khẩu trên thế giới. Quay lại đầu trang

Nếu bạn PHẢI lưu trữ mật khẩu, (mà có thể) bạn có thể thử để lưu trữ nó bên ngoài webroot, ví dụ: /var/www/public_html/ Đặt codez của bạn ở đây
/var/www/includes/ Đặt mật khẩu của bạn ở đây

Thậm chí tốt hơn so với đó sẽ là để có hệ thống mà bạn cần mật khẩu (ví dụ: trình bao bọc cơ sở dữ liệu) trả về một đối tượng đã được khởi tạo. thay vì yêu cầu $databasepassword bạn yêu cầu đối tượng PDO và lưu trữ các lớp cơ sở dữ liệu của bạn bên ngoài webroot.

Tùy thuộc vào các vectơ tấn công nào sẽ khiến ai đó có quyền truy cập vào văn bản mật khẩu đó và có thể yêu cầu chúng nằm trong hệ thống tệp của bạn, nếu có, bạn có thể bị lỗi.

Ngoài ra, nếu mật khẩu cho nội dung người đăng ký bảo mật của bạn, tất cả những gì bạn mất là một số phí đăng ký, nếu cơ sở dữ liệu của bạn, bạn có thể gặp sự cố, nếu đó là chi tiết ngân hàng trực tuyến của bạn cho bạn.

Mật khẩu đang bảo vệ giá trị như thế nào?

+0

Sẽ không trong quá trình xác thực đến máy chủ cơ sở dữ liệu, mật khẩu trong bản rõ được gửi qua tcp/ip? –

+1

Hầu hết lưu trữ được chia sẻ có cơ sở dữ liệu cục bộ chỉ chạy trên loopback, do đó, không thực sự là một vấn đề ở đó. Ngoài ra nếu bạn không ở trên lưu trữ được chia sẻ, có thể có ít vấn đề bảo mật hơn để lo lắng về việc truy cập lại hệ thống tập tin, v.v. – garrow

+1

Mặc dù được khuyến nghị không sử dụng cùng một mật khẩu trên nhiều trang web, nhiều người vẫn sẽ làm điều đó. Nếu mật khẩu của người dùng của bạn được tiết lộ, bảo mật/quyền riêng tư của họ cũng có thể bị xâm phạm trong các ứng dụng khác. – felixbade

0

Trừ khi chính trang web đó bị xâm phạm và bây giờ tất cả những thứ mà mật khẩu đó cấp quyền truy cập (DB của bạn, có lẽ?).

0

Nó phụ thuộc vào cách bạn xác định 'an toàn'.

Bạn nói đúng rằng một người dùng chung sẽ không nhìn thấy nó.

Tuy nhiên, đó thực sự là một thực tế không tốt; nếu trang web của bạn bị xâm phạm, mật khẩu này sẽ cung cấp quyền truy cập vào những gì khác? Tôi muốn nói ở mức tối thiểu bạn nên lưu trữ một băm mật khẩu, không phải là bản rõ.

+0

Làm cách nào để bạn kết nối với cơ sở dữ liệu nếu bạn chỉ có băm mật khẩu? – Piskvor

+0

Vâng - nếu mật khẩu là cho một kết nối cơ sở dữ liệu (OP không nói nó là) thì đó là khó khăn – DanSingerman

6

Thông thường, họ không thể nhìn thấy. Nhưng nếu một cái gì đó xấu xảy ra trên máy chủ có một khả năng lớn là máy chủ sẽ trả về mã php của bạn bằng văn bản thuần túy với việc thực hiện nó và do đó người dùng sẽ thấy tất cả nguồn của tệp đó và mật khẩu của bạn.

Tôi sẽ lưu trữ mật khẩu ở nơi không có tài liệu gốc (Không thể mở trong trình duyệt) và sau đó mở tệp đó bằng php và đọc nội dung (mật khẩu). Hoặc nếu bạn có nhiều mật khẩu/người dùng, tôi sẽ lưu trữ chúng trong cơ sở dữ liệu để truy cập nhanh.

Nếu bạn muốn sử dụng cách bố trí phương pháp tập tin thư mục nên giống như thế này (depneds trên máy chủ)

/public_html/index.php

/password.txt

$myFile = $_SERVER['DOCUMENT_ROOT'] + "/../password.txt"; 
if file_exists($myFile) { 
    $fh = fopen($myFile, 'r'); 
    $password = fgets($fh); 
    fclose($fh); 
} else die("No password file"); 
if ($user_input == $password) { 
    ...... Authentication succeeded .......... 
    ......your relatively protected code ..... 
} else die("Wrong password"); 

Nếu bạn muốn bảo mật hơn thay vì lưu trữ mật khẩu dưới dạng văn bản trong tệp văn bản đó. Đau nó băm và sau đó khi bạn muốn so sánh nó với người dùng nhập vào tạo ra băm từ đầu vào người dùng và so sánh nó với hash của mật khẩu mà bạn tải từ tập tin văn bản

sha1($user_input) == $password_from_txt 
+0

Wow, tôi đã quên rằng tôi đã trả lời các câu hỏi PHP. Vẫn còn thú vị để xem một downvote gần 6 năm sau w/o một bình luận. Ngoài ra, geez, thế giới đã rất khác biệt trở lại sau đó. –

2

Chừng nào cài đặt PHP của bạn hoạt động như mong muốn, điều này không kém an toàn hơn bất kỳ phương pháp nào khác. Tôi muốn đặt tên hằng số (define) trên biến. Ngoài ra, bạn có thể xem xét việc lưu trữ một băm mật khẩu, thay vì mật khẩu đơn giản. Điều này ngăn chặn ăn cắp mật khẩu của bạn ngay cả khi trang web bị xâm phạm.

Vì thực tế không tốt, điều đó phụ thuộc. Nếu bạn cần lưu trữ chỉ một mật khẩu, cách tiếp cận này là ok. Lưu trữ chúng bên ngoài gốc tài liệu có thể cho cảm giác giả mạo về bảo mật thêm; tài liệu gốc không còn tuyệt đối hơn bất kỳ thiết lập nào khác của máy chủ.

+2

Tôi đã xem các trang web bán phá giá nguồn php dưới dạng văn bản thuần túy. Nếu điều đó xảy ra và tệp nằm ngoài tài liệu gốc, ngay cả khi mọi người đều biết tệp ở đâu từ nguồn, họ không thể "đơn giản" truy cập tệp từ trình duyệt. –

+0

Tôi hiểu ý tưởng lưu trữ những thứ bên ngoài docroot, và có thể nó thêm một số bảo mật, nhưng tôi nghĩ rằng nó được đánh giá quá cao. Nếu các trang web bãi chứa nguồn php, nó bị hỏng. Và nếu nó bị hỏng, docroot cũng có thể là cái gì đó khác hơn chúng ta mong muốn - ví dụ/ –

+1

Lưu trữ những thứ bên ngoài webroot không phải là thuốc chữa bách bệnh, bạn không thể chỉ in biến ra ngoài được. Nhưng nó cung cấp cho bạn một sự tách biệt mà sau đó bạn có thể thực thi trong mã của bạn, các lớp học và init đi ra ngoài webroot, mã trình bày đi bên trong webroot. – garrow

10

Tùy thuộc vào cách bạn xác định an toàn, bất kỳ phương pháp tiếp cận nào có các khía cạnh tích cực và tiêu cực của nó.

Nếu bạn thực sự muốn để lưu trữ mật khẩu trong nguồn của bạn, nó có thể là một ý tưởng tốt để làm điều gì đó đại loại:

File: config.php

if(! defined('IN_CODE')) die('Hacking attempt'); 

define('PASSWORD_HASH', '098f6bcd4621d373cade4e832627b4f6'); 

File: index.php

define('IN_CODE', '1'); 

include('passwd.php'); 

if(md5($password) == PASSWORD_HASH) 
... 

Văn bản thuần túy không bao giờ là ý tưởng hay, luôn lưu trữ mật khẩu của mật khẩu bạn muốn lưu trữ.

Hơn nữa, hãy thử phân tách các định nghĩa như thế này từ tệp nguồn chính của bạn.

0

Đôi khi nó chỉ phải là f.e. cho một ứng dụng thư nơi bạn chỉ có thể đăng nhập bằng mật khẩu thuần túy và không phải bằng một băm. Và nếu ứng dụng của bạn không có vấn đề bảo mật, nó sẽ không ảnh hưởng đến bạn.

0

Tôi tin rằng hầu hết các lần mật khẩu văn bản thuần túy sẽ là mật khẩu cơ sở dữ liệu như MySQL, cho exmaple, sẽ không chấp nhận băm để xác thực.

Như đã đề cập trước khi giải pháp tốt nhất là giữ tệp cấu hình PHP bằng mật khẩu bên ngoài webroot.

Nếu bạn lo lắng rằng ai đó có thể nhìn thấy mật khẩu của bạn trong khi bạn xem tệp, bạn có thể đơn giản làm cho nó không thể đọc được đối với người dùng base64 funciton.

Xem this post để biết chi tiết và thậm chí cả tiện ích nhỏ cho Windows, Linux và Mac giúp dễ dàng hơn.

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