2012-01-31 19 views
7

Tôi biết quy tắc: không bao giờ mã hóa mật khẩu của bạn và tôi đã xem câu hỏi này here giải thích điều gì với Java và mySQL, nhưng tôi không biết phải làm gì với PHP và mySQL.Làm cách nào để bảo vệ chuỗi kết nối mySQL trong PHP?

Chuỗi kết nối hiện tại được làm như thế này

<?PHP 

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

$Link = mysql_connect($Host , $User , $Password , $DBName); 

if (!$Link) { 
    die('Could not connect: ' . mysql_error()); 
} 

?> 
  • nhưng tôi cần phải có mật khẩu bảo đảm, tức là không hardcoded trong tập tin này. Tôi phải làm nó như thế nào?

EDIT: Đối với tất cả các downvotes tôi nhận được về vấn đề này, tôi vẫn chưa nhận được trả lời cho câu hỏi đó là về một mối quan tâm an ninh chính hãng - mật khẩu mã hóa cứng. Sẽ không hữu ích khi bỏ phiếu bầu cho một câu hỏi thực sự mà không cần đăng bình luận hoặc câu trả lời hoàn thành câu hỏi.

+2

tốt, không đặt mật khẩu trong mã. Nếu đó là mã nguồn mở, thì không ai cần mật khẩu –

+2

đặt nó vào một tệp cấu hình riêng và bỏ qua nó trong GIT – Bogdan

+0

Bạn có thể đặt mật khẩu trong một tệp riêng biệt như Bogdan đề xuất và gitignore nó cho mục đích phát triển. Để phát triển nó thực sự có thể dễ dàng hơn để chỉ giữ mật khẩu trong dsn. Cách nào bạn đi phụ thuộc vào mức độ thoải mái của bạn. Để sản xuất, hãy giữ mật khẩu trên hộp sản xuất nơi mã của bạn sẽ thực thi. Hạn chế quyền truy cập vào hộp và quản lý mật khẩu được đặt/đặt lại thông qua đầu bếp, con rối, vải, v.v. – dminer

Trả lời

-2

Không có lý do gì để ẩn mật khẩu MySQL của bạn. Chỉ cần hạn chế quyền truy cập vào cơ sở dữ liệu từ máy chủ từ xa. Ngoài ra, bạn có thể đặt người dùng MySQL mặc định không có mật khẩu cho dự án/máy chủ/cơ sở dữ liệu/hành động cụ thể này.

Để trả lời câu hỏi của bạn trực tiếp, không có cách nào làm xáo trộn mật khẩu.

+0

Không ẩn mật khẩu dường như bay khi đối mặt với sự khôn ngoan được chấp nhận. Tôi cũng không yêu cầu mật khẩu bị tịch thu, vừa bảo đảm. – T9b

+0

@ T9b, sử dụng người dùng mặc định sau đó, không có mật khẩu. Nhưng sau đó một lần nữa, không có lý do gì để ẩn mật khẩu MySQL nếu truy cập từ xa bị hạn chế, ví dụ: xem http://www.opensourcecms.com/ một số CMS được lưu trữ cho phép thay đổi cài đặt DB, người dùng cũng có thể thấy mật khẩu và họ hoàn toàn nhận thức được điều đó. – Gajus

1

Lưu trữ cấu hình của bạn vào một tệp khác.

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

Thiết lập git bỏ qua cho tệp cấu hình này.

+1

Các cấu hình nằm trong một tệp khác và có git có thể bỏ qua tệp nhưng điều đó không trả lời được câu hỏi của tôi. – T9b

-1

Không có vấn đề với thông tin đăng nhập mã hóa vào tệp cấu hình nhất thiết.

Đối với dự án được mã hóa phiên bản nguồn, bạn nên cân nhắc việc tạo mẫu cấu hình với trình giữ chỗ cho mọi thông tin đăng nhập mà bạn cam kết lưu trữ.

Trong bất kỳ triển khai nào, bạn nên chỉnh sửa các trình giữ chỗ này làm thanh toán thông tin đăng nhập trực tiếp. Điều này cũng sẽ hỗ trợ bất cứ ai sử dụng dự án của bạn nếu bạn đang đi để mở nguồn nó.

cập nhật cuối (để thực sự trả lời câu hỏi)

cấu hình

Cơ sở dữ liệu thực sự cần phải được trong văn bản đơn giản, hardcoded vào một file PHP, tuy nhiên bạn làm có thể một số điều để chắc chắn rằng nó an toàn hơn:

  1. Kiểm tra cấu hình Apache của bạn open_basedir hạn chế các trường hợp vhost khác từ các tập tin truy cập bên ngoài thư mục gốc web của họ
  2. Kiểm tra sự cho phép hệ thống tập tin để đảm bảo chỉ apache và người dùng của bạn có thể truy cập các tập tin
  3. 01.
  4. Hãy chắc chắn rằng người dùng mysql của bạn chỉ được thiết lập để có giá trị từ một bối cảnh localhost, tức là grant all privileges on mydatabase.* to [email protected] vv
  5. Sử dụng tường lửa để ngăn chặn các kết nối bên ngoài để mysql
+0

Câu hỏi không phải là về khía cạnh phiên bản, đó là về việc bảo mật mật khẩu bằng cách nào đó để sử dụng với PHP. Bạn có thể cho tôi một ví dụ trả lời câu hỏi không? – T9b

+0

Đảm bảo quyền truy cập hệ thống tệp của bạn là chính xác và đó là tất cả những gì thực sự quan trọng. Miễn là chỉ có bạn và apache mới có thể truy cập nó, bạn sẽ ổn thôi. Ngoài ra hãy chắc chắn rằng cấu hình mở dựa trên apache của bạn là chính xác. Thêm vào đó, nếu mysql tạo câu lệnh người dùng chỉ định người dùng @ localhost, nó sẽ an toàn hơn –

1

Bạn sẽ phải cứng mã mật khẩu ở đâu đó hoặc khác. Thậm chí nếu bạn muốn sử dụng DSN, bạn sẽ phải mã hóa mật khẩu trong chuỗi DSN. Như tôi thấy nó không có được từ khó mã hóa mật khẩu.

Vì vậy, câu hỏi sẽ tóm tắt những gì bạn có thể làm để bảo mật tệp/chuỗi chứa mật khẩu. Việc thiết lập các quyền hệ thống tệp thích hợp cho tệp có chứa mật khẩu và thiết lập giá trị open_basedir thích hợp là những gì bạn có thể làm. Như đã đề cập trong một trong các bài đăng trong What's best way to secure a database connection string?, bạn cũng có thể xem xét sử dụng phân vùng được mã hóa.

Liên kết bạn đăng trong câu hỏi của mình, theo như hiểu biết của tôi, nói về ứng dụng dành cho máy tính để bàn. Và các ứng dụng máy tính để bàn trong PHP là quá ít để đưa ra một suy nghĩ nghiêm túc về vấn đề bảo mật mật khẩu cơ sở dữ liệu cho các ứng dụng máy tính để bàn php.

1

Tôi cũng đang nghiên cứu về chủ đề này. Cho phép tệp là một trong những chiến lược nhưng có rất nhiều vectơ.

Nhưng hãy nói trong một trường hợp bạn có quyền truy cập FTP hoặc SSH vào máy chủ và ai đó xâm phạm đăng nhập FTP. Thông tin đăng nhập này giống với thư mục public_html của tài khoản người dùng. Người đó có thể duyệt qua và đọc các tệp này. Khá nhiều vào thời điểm này xấu của nó. Tuy nhiên, bạn có thể có một cấu hình trên hệ thống, nơi bạn jail tù người dùng vào thư mục chủ của mình mà thôi.

Có lẽ bạn có thể tạo thư mục .private ở một cấp bên ngoài thư mục chính của người dùng đó. Sau đó, trong các tệp php cho người dùng đó, người có các kịch bản lệnh của mình trong tệp public_html, bao gồm tệp kết nối tồn tại trong thư mục .private (ví dụ: ../../.private/connect.php).

Tôi không biết điều này có hiệu quả không nếu người dùng bị bỏ tù - nhưng loại này dường như là bảo mật thông qua điều tối nghĩa.

1

Xây dựng dựa trên những gì Cajus Kuinzinas bỏ qua ... Xem xét việc có cơ sở dữ liệu bị hạn chế lưu trữ thông tin đăng nhập của ứng dụng. Khi ứng dụng của bạn khởi tạo, hãy thực hiện truy vấn bằng tài khoản chỉ đọc có thể tra cứu thông tin đăng nhập vào cơ sở dữ liệu ứng dụng thực tế.

Để đảm bảo an toàn hơn, giá trị được lưu trữ trong cơ sở dữ liệu tra cứu không được là mật khẩu hoàn chỉnh. Ứng dụng của bạn có thể băm giá trị này cùng với một muối để tạo mật khẩu thực. Ngoài ra, bạn có thể lưu bộ nhớ cache này vào bộ nhớ, nếu muốn, để giảm số lần truy cập trong tương lai.

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