Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Khi một ứng dụng PHP tạo kết nối cơ sở dữ liệu, tất nhiên thường cần truyền thông tin đăng nhập và mật khẩu. Nếu tôi đang sử dụng một thông tin đăng nhập đơn, gửi tối thiểu cho ứng dụng của mình, thì PHP cần biết rằng đăng nhập và mật khẩu ở đâu đó. Cách tốt nhất để bảo mật mật khẩu đó là gì? Có vẻ như chỉ viết nó trong mã PHP không phải là một ý tưởng tốt.

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Khao khát

12.9k6 Huy hiệu vàng61 Huy hiệu bạc91 Huy hiệu Đồng6 gold badges61 silver badges91 bronze badges

hỏi ngày 18 tháng 9 năm 2008 lúc 23:27Sep 18, 2008 at 23:27

3

Một số người đọc sai điều này như một câu hỏi về cách lưu trữ mật khẩu trong cơ sở dữ liệu. Đó là sai. Đó là về cách lưu trữ mật khẩu cho phép bạn vào cơ sở dữ liệu.store passwords in a database. That is wrong. It is about how to store the password that lets you get to the database.

Giải pháp thông thường là chuyển mật khẩu ra khỏi mã nguồn vào tệp cấu hình. Sau đó để quản trị và đảm bảo tệp cấu hình đó cho quản trị viên hệ thống của bạn. Bằng cách đó, các nhà phát triển không cần biết bất cứ điều gì về mật khẩu sản xuất và không có bản ghi mật khẩu trong kiểm soát nguồn của bạn.

Farray

8.0743 Huy hiệu vàng32 Huy hiệu bạc37 Huy hiệu đồng3 gold badges32 silver badges37 bronze badges

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:32Sep 18, 2008 at 23:32

user11318user11318user11318

9.1932 Huy hiệu vàng25 Huy hiệu bạc25 Huy hiệu Đồng2 gold badges25 silver badges25 bronze badges

18

Nếu bạn đang lưu trữ trên máy chủ của người khác và không có quyền truy cập bên ngoài Webroot của bạn, bạn luôn có thể đặt mật khẩu và/hoặc kết nối cơ sở dữ liệu của mình vào một tệp và sau đó khóa tệp bằng .htaccess:


order allow,deny
deny from all

Đã trả lời ngày 3 tháng 8 năm 2009 lúc 18:28Aug 3, 2009 at 18:28

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Kellenkellenkellen

6.8253 huy hiệu vàng21 Huy hiệu bạc10 Huy hiệu đồng3 gold badges21 silver badges10 bronze badges

8

Cách an toàn nhất là không có thông tin được chỉ định trong mã PHP của bạn.

Nếu bạn đang sử dụng Apache có nghĩa là đặt chi tiết kết nối trong tệp HTTPD.conf hoặc tệp máy chủ ảo của bạn. Nếu bạn làm điều đó, bạn có thể gọi mysql_connect () không có tham số, điều đó có nghĩa là PHP sẽ không bao giờ xuất thông tin của bạn.

Đây là cách bạn chỉ định các giá trị này trong các tệp đó:

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

Sau đó, bạn mở kết nối MySQL như thế này:

Hoặc như thế này:

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Đã trả lời ngày 16 tháng 4 năm 2012 lúc 15:13Apr 16, 2012 at 15:13

Lars Nyströmlars NyströmLars Nyström

5.5772 Huy hiệu vàng30 Huy hiệu bạc31 Huy hiệu Đồng2 gold badges30 silver badges31 bronze badges

10

Lưu trữ chúng trong một tập tin bên ngoài Root Web.

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:32Sep 18, 2008 at 23:32

da5idda5idda5id

9.1932 Huy hiệu vàng25 Huy hiệu bạc25 Huy hiệu Đồng8 gold badges38 silver badges53 bronze badges

4

Nếu bạn đang lưu trữ trên máy chủ của người khác và không có quyền truy cập bên ngoài Webroot của bạn, bạn luôn có thể đặt mật khẩu và/hoặc kết nối cơ sở dữ liệu của mình vào một tệp và sau đó khóa tệp bằng .htaccess:

Đã trả lời ngày 3 tháng 8 năm 2009 lúc 18:28Sep 19, 2008 at 13:33

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Kellenkellenpdavis

6.8253 huy hiệu vàng21 Huy hiệu bạc10 Huy hiệu đồng1 gold badge30 silver badges31 bronze badges

7

Cách an toàn nhất là không có thông tin được chỉ định trong mã PHP của bạn.

  1. Nếu bạn đang sử dụng Apache có nghĩa là đặt chi tiết kết nối trong tệp HTTPD.conf hoặc tệp máy chủ ảo của bạn. Nếu bạn làm điều đó, bạn có thể gọi mysql_connect () không có tham số, điều đó có nghĩa là PHP sẽ không bao giờ xuất thông tin của bạn.
  2. Đây là cách bạn chỉ định các giá trị này trong các tệp đó:
  3. Sau đó, bạn mở kết nối MySQL như thế này:

Advantages:

  1. Hoặc như thế này:
  2. Đã trả lời ngày 16 tháng 4 năm 2012 lúc 15:13
  3. Lars Nyströmlars Nyström
  4. 5.5772 Huy hiệu vàng30 Huy hiệu bạc31 Huy hiệu Đồng
  5. Lưu trữ chúng trong một tập tin bên ngoài Root Web.
  6. 9.0408 Huy hiệu vàng38 Huy hiệu bạc53 Huy hiệu đồng

Đối với các hệ thống cực kỳ an toàn, chúng tôi mã hóa mật khẩu cơ sở dữ liệu trong tệp cấu hình (được bảo đảm bởi quản trị viên hệ thống). Trên Ứng dụng/Máy chủ khởi động, ứng dụng sau đó nhắc Quản trị viên Hệ thống cho khóa giải mã. Mật khẩu cơ sở dữ liệu sau đó được đọc từ tệp cấu hình, được giải mã và lưu trữ trong bộ nhớ để sử dụng trong tương lai. Vẫn chưa an toàn 100% vì nó được lưu trữ trong bộ nhớ được giải mã, nhưng bạn phải gọi nó là 'đủ an toàn' tại một số điểm!

Đã trả lời ngày 19 tháng 9 năm 2008 lúc 13:33Dec 23, 2013 at 21:48

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

PdavispdavisNeil McGuigan

3.1741 Huy hiệu vàng 30 Huy hiệu bạc31 Huy hiệu Đồng12 gold badges120 silver badges147 bronze badges

Giải pháp này là chung, trong đó nó hữu ích cho cả các ứng dụng nguồn mở và đóng.

mysql_connect("localhost", "me", "mypass");

Tạo người dùng hệ điều hành cho ứng dụng của bạn. Xem http://en.wikipedia.org/wiki/Principle_OF_LEAST_PRIVILEGE

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  

Tạo biến môi trường hệ điều hành (không) cho người dùng đó, với mật khẩuSep 19, 2008 at 19:25

Chạy ứng dụng như người dùng đóBob Fanger

Bạn sẽ không kiểm tra mật khẩu của mình để kiểm soát nguồn một cách tình cờ, vì bạn không thể7 gold badges61 silver badges78 bronze badges

4

Bạn sẽ không vô tình làm hỏng quyền của tập tin. Chà, bạn có thể, nhưng nó sẽ không ảnh hưởng đến điều này.

Chỉ có thể được đọc bởi root hoặc người dùng đó. Root có thể đọc tất cả các tệp và khóa mã hóa của bạn bằng mọi cách.

Nếu bạn sử dụng mã hóa, bạn đang lưu trữ chính như thế nào?

Con với điều này là bây giờ mật khẩu nằm trong biến PHP toàn cầu.

Để giảm thiểu rủi ro này, chúng tôi có các biện pháp phòng ngừa sau:

  • Mật khẩu được mã hóa. Chúng tôi mở rộng lớp PDO để bao gồm logic để giải mã mật khẩu. Nếu ai đó đọc mã nơi chúng tôi thiết lập kết nối, thì rõ ràng là kết nối đang được thiết lập với mật khẩu được mã hóa chứ không phải chính mật khẩu. We extend the PDO class to include logic for decrypting the password. If someone reads the code where we establish a connection, it won't be obvious that the connection is being established with an encrypted password and not the password itself.
  • Mật khẩu được mã hóa được chuyển từ các biến toàn cầu thành một biến riêng tư, ứng dụng thực hiện điều này ngay lập tức để giảm cửa sổ mà giá trị có sẵn trong không gian toàn cầu. The application does this immediately to reduce the window that the value is available in the global space.
  • phpinfo() bị vô hiệu hóa. PHPINFO là một mục tiêu dễ dàng để có được cái nhìn tổng quan về mọi thứ, bao gồm các biến môi trường. PHPInfo is an easy target to get an overview of everything, including environment variables.

Đã trả lời ngày 15 tháng 2 năm 2017 lúc 2:41Feb 15, 2017 at 2:41

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Courtney Milescourtney dặmCourtney Miles

3.5863 huy hiệu vàng28 Huy hiệu bạc46 Huy hiệu đồng3 gold badges28 silver badges46 bronze badges

2

Nếu bạn đang sử dụng PostgreSQL, thì nó sẽ tự động vào ~/.pgpass cho mật khẩu. Xem hướng dẫn để biết thêm thông tin.

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:52Sep 18, 2008 at 23:52

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

JimjimJim

72K14 Huy hiệu vàng100 Huy hiệu bạc105 Huy hiệu Đồng14 gold badges100 silver badges105 bronze badges

Lựa chọn của bạn bị giới hạn như bạn nói rằng bạn cần mật khẩu để truy cập cơ sở dữ liệu. Một cách tiếp cận chung là lưu trữ tên người dùng và mật khẩu trong tệp cấu hình riêng biệt thay vì tập lệnh chính. Sau đó, hãy chắc chắn lưu trữ bên ngoài cây web chính. Đó là nếu có một vấn đề cấu hình web để lại các tệp PHP của bạn được hiển thị đơn giản là văn bản thay vì được thực thi, bạn không tiết lộ mật khẩu.

Ngoài ra, bạn đang ở đúng dòng với quyền truy cập tối thiểu cho tài khoản đang được sử dụng. Thêm vào đó

  • Không sử dụng kết hợp tên người dùng/mật khẩu cho bất kỳ thứ gì khác
  • Định cấu hình máy chủ cơ sở dữ liệu chỉ chấp nhận kết nối từ máy chủ web cho người dùng đó (localhost thậm chí còn tốt hơn nếu db ở cùng một máy) cỗ máy.
  • Obfuscate mật khẩu (thậm chí ROT13 sẽ làm) nó sẽ không đưa ra nhiều khả năng bảo vệ nếu một số người có quyền truy cập vào tệp, nhưng ít nhất nó sẽ ngăn chặn việc xem thông thường của nó.

Peter

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:36Sep 18, 2008 at 23:36

VagnerrvagnerrVagnerr

2.9373 huy hiệu vàng33 Huy hiệu bạc46 Huy hiệu đồng3 gold badges33 silver badges46 bronze badges

Chúng tôi đã giải quyết nó theo cách này:

  1. Sử dụng Memcache trên máy chủ, với kết nối mở từ máy chủ mật khẩu khác.
  2. Lưu vào MemCache Mật khẩu (hoặc thậm chí tất cả các tệp Password.php được mã hóa) cộng với khóa giải mã.
  3. Trang web, gọi khóa MemCache giữ mật khẩu tệp mật khẩu và giải mã trong bộ nhớ tất cả các mật khẩu.
  4. Máy chủ mật khẩu gửi một tệp mật khẩu được mã hóa mới cứ sau 5 phút.
  5. Nếu bạn sử dụng mật khẩu được mã hóa.php trên dự án của mình, bạn sẽ đặt một cuộc kiểm toán, đó là kiểm tra xem tệp này có được chạm vào bên ngoài không - hoặc được xem. Khi điều này xảy ra, bạn tự động có thể làm sạch bộ nhớ, cũng như đóng máy chủ để truy cập.

Đã trả lời ngày 28 tháng 8 năm 2016 lúc 16:27Aug 28, 2016 at 16:27

Asi Azulayasi AzulayAsi Azulay

711 Huy hiệu bạc1 Huy hiệu đồng1 silver badge1 bronze badge

Đặt mật khẩu cơ sở dữ liệu vào một tệp, làm cho nó chỉ đọc cho người dùng phục vụ các tệp.

Trừ khi bạn có một số phương tiện chỉ cho phép quy trình máy chủ PHP truy cập cơ sở dữ liệu, đây là điều khá nhiều bạn có thể làm.

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:32Sep 18, 2008 at 23:32

ChrischrisChris

4.77422 Huy hiệu bạc17 Huy hiệu đồng22 silver badges17 bronze badges

Nếu bạn đang nói về mật khẩu cơ sở dữ liệu, trái ngược với mật khẩu đến từ trình duyệt, thực tiễn tiêu chuẩn dường như là đặt mật khẩu cơ sở dữ liệu trong tệp cấu hình PHP trên máy chủ.

Bạn chỉ cần chắc chắn rằng tệp PHP chứa mật khẩu có quyền thích hợp trên đó. I E. Nó chỉ có thể đọc được bởi máy chủ web và tài khoản người dùng của bạn.

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:35Sep 18, 2008 at 23:35

Jason Wadsworthjason WadsworthJason Wadsworth

9331 Huy hiệu vàng10 Huy hiệu bạc18 Huy hiệu đồng1 gold badge10 silver badges18 bronze badges

3

Một thủ thuật bổ sung là sử dụng tệp cấu hình riêng của PHP trông như thế:



[...]

Plain text data including password

Điều này không ngăn bạn thiết lập quy tắc truy cập đúng. Nhưng trong trường hợp trang web của bạn bị hack, "yêu cầu" hoặc "bao gồm" sẽ chỉ thoát tập lệnh ở dòng đầu tiên để thậm chí còn khó có được dữ liệu hơn.

Tuy nhiên, đừng bao giờ để các tệp cấu hình trong một thư mục có thể được truy cập thông qua web. Bạn nên có một thư mục "web" chứa mã điều khiển, CSS, hình ảnh và JS của bạn. Đó là tất cả. Bất cứ điều gì khác đi trong các thư mục ngoại tuyến.

Đã trả lời ngày 19 tháng 9 năm 2008 lúc 13:08Sep 19, 2008 at 13:08

e-satise-satise-satis

564K109 Huy hiệu vàng294 Huy hiệu bạc328 Huy hiệu đồng109 gold badges294 silver badges328 bronze badges

5

Chỉ cần đặt nó vào một tệp cấu hình ở đâu đó là cách nó thường được thực hiện. Chỉ cần chắc chắn rằng bạn:

  1. không cho phép truy cập cơ sở dữ liệu từ bất kỳ máy chủ nào bên ngoài mạng của bạn,
  2. Cẩn thận không vô tình hiển thị mật khẩu cho người dùng (trong một thông báo lỗi hoặc thông qua các tệp PHP vô tình được phục vụ như HTML, etcetera.)

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Raptor

52.1K44 Huy hiệu vàng223 Huy hiệu bạc357 Huy hiệu đồng44 gold badges223 silver badges357 bronze badges

Đã trả lời ngày 18 tháng 9 năm 2008 lúc 23:35Sep 18, 2008 at 23:35

MarijnmarijnMarijn

2.0162 Huy hiệu vàng13 Huy hiệu bạc11 Huy hiệu đồng2 gold badges13 silver badges11 bronze badges

Cách tốt nhất là không lưu trữ mật khẩu ở tất cả! Chẳng hạn, nếu bạn đang ở trên hệ thống Windows và kết nối với SQL Server, bạn có thể sử dụng xác thực tích hợp để kết nối với cơ sở dữ liệu mà không cần mật khẩu, sử dụng danh tính của quy trình hiện tại.
For instance, if you're on a Windows system, and connecting to SQL Server, you can use Integrated Authentication to connect to the database without a password, using the current process's identity.

Nếu bạn cần kết nối bằng mật khẩu, trước tiên hãy mã hóa nó, sử dụng mã hóa mạnh (ví dụ: sử dụng AES-256, sau đó bảo vệ khóa mã hóa hoặc sử dụng mã hóa không đối xứng và có hệ điều hành bảo vệ chứng nhận), sau đó lưu trữ nó trong Tệp cấu hình (bên ngoài thư mục web) với ACL mạnh.encrypt it, using strong encryption (e.g. using AES-256, and then protect the encryption key, or using asymmetric encryption and have the OS protect the cert), and then store it in a configuration file (outside of the web directory) with strong ACLs.

Đã trả lời ngày 20 tháng 9 năm 2008 lúc 21:17Sep 20, 2008 at 21:17

AvidavidAviD

12.9k6 Huy hiệu vàng61 Huy hiệu bạc91 Huy hiệu Đồng6 gold badges61 silver badges91 bronze badges

5

Trên thực tế, thực tiễn tốt nhất là lưu trữ cơ sở dữ liệu của bạn các biến số trong các biến môi trường vì:

  • Các thông tin này phụ thuộc vào môi trường, điều đó có nghĩa là bạn sẽ không có cùng thông tin đăng nhập trong Dev/Prod. Lưu trữ chúng trong cùng một tệp cho tất cả môi trường là một sai lầm.
  • Thông tin đăng nhập không liên quan đến logic kinh doanh có nghĩa là đăng nhập và mật khẩu không có gì để làm trong mã của bạn.not related to business logic which means login and password have nothing to do in your code.
  • Bạn có thể đặt các biến môi trường mà không cần tạo bất kỳ tệp lớp mã kinh doanh nào, điều đó có nghĩa là bạn sẽ không bao giờ phạm sai lầm khi thêm các tệp thông tin xác thực vào một cam kết trong GIT.
  • Các biến môi trường là SuperGlobales: Bạn có thể sử dụng chúng ở mọi nơi trong mã của mình mà không bao gồm bất kỳ tệp nào.

Làm thế nào để sử dụng chúng?

  • Sử dụng mảng $ _ENV:
    • Cài đặt: $_ENV['MYVAR'] = $myvar
    • Nhận:
      php_value mysql.default.user      myusername
      php_value mysql.default.password  mypassword
      php_value mysql.default.host      server
      
      0
  • Sử dụng các chức năng PHP:
    • Cài đặt với hàm PUTENV -
      php_value mysql.default.user      myusername
      php_value mysql.default.password  mypassword
      php_value mysql.default.host      server
      
      1
    • Nhận chức năng Getenv -
      php_value mysql.default.user      myusername
      php_value mysql.default.password  mypassword
      php_value mysql.default.host      server
      
      2
  • Trong các tệp vhosts và .htaccess nhưng nó không được khuyến nghị vì nó trong một tệp khác và nó không giải quyết được vấn đề bằng cách thực hiện theo cách này.

Bạn có thể dễ dàng bỏ một tệp như envvars.php với tất cả các biến môi trường bên trong và thực thi nó (

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server
3) và xóa nó. Đó là một trường học hơi cũ, nhưng nó vẫn hoạt động và bạn không có bất kỳ tệp nào với thông tin đăng nhập của mình trong máy chủ và không có thông tin đăng nhập trong mã của bạn. Vì nó hơi lao động, các khung làm điều đó tốt hơn.

Ví dụ với Symfony (OK không chỉ PHP) Các khung hiện đại như Symfony khuyến nghị sử dụng các biến môi trường và lưu trữ chúng trong một tệp .Env không cam kết hoặc trực tiếp trong các dòng lệnh có nghĩa là bạn có thể làm được: The modern frameworks such as Symfony recommends using environment variables, and store them in a .env not commited file or directly in command lines which means you wether can do :

  • Với CLI:
    php_value mysql.default.user      myusername
    php_value mysql.default.password  mypassword
    php_value mysql.default.host      server
    
    4
  • Với .Env hoặc .Env.local: foo = "Bar"

Tài liệu :

Đã trả lời ngày 28 tháng 12 năm 2020 lúc 10:08Dec 28, 2020 at 10:08

Hướng dẫn how can i protect my database password in php? - làm cách nào tôi có thể bảo vệ mật khẩu cơ sở dữ liệu của mình trong php?

Php Store được mã hóa mật khẩu trong cơ sở dữ liệu như thế nào?

Quá trình này được sử dụng để mã hóa mật khẩu: Tạo một khóa mã hóa duy nhất (DEK) tranh giành thông tin sử dụng mã hóa khóa duy nhất. Di chuyển khóa mã hóa duy nhất (DEK) sang đám mây KMS để mã hóa, trả về KEK. Lưu dữ liệu được mã hóa và khóa (KEK) cùng với nhau.Create a unique encryption key (DEK) Scramble the information utilizing unique key encryption. Move the unique encryption key (DEK) to Cloud KMS for encryption, which returns the KEK. Save the encrypted data and key (KEK) along with each other.

Có an toàn để lưu trữ mật khẩu trong tệp PHP không?

Đề xuất của tôi: Không lưu trữ mật khẩu trong mã nguồn.Thay vào đó, lưu trữ chúng trong một tệp cấu hình (bên ngoài gốc web) và đảm bảo tệp cấu hình không thể truy cập công khai.Don't store passwords in source code. Instead, store them in a configuration file (outside of the web root), and make sure the configuration file is not publicly accessible.

Chúng ta có thể lưu mật khẩu trong cơ sở dữ liệu không?

Lưu trữ mật khẩu văn bản thuần túy trong cơ sở dữ liệu là một tội lỗi.Các hàm mã hóa cung cấp ánh xạ một-một giữa đầu vào và đầu ra và chúng luôn có thể đảo ngược.Nếu hacker nhận được chìa khóa, anh ta sẽ có thể giải mã mật khẩu.Cách tốt hơn sẽ là sử dụng hàm băm mật mã một chiều.. Encryption functions provide one-one mapping between input and output and they are always reversible. If the hacker gets the key, he will be able to decrypt the passwords. The better way would be to use a one way cryptographic hash function.

Làm thế nào chúng ta có thể mã hóa tên người dùng và mật khẩu bằng PHP?

Mã hóa mật khẩu: Để tạo hàm băm từ chuỗi, chúng tôi sử dụng hàm password_hash ().Hàm password_hash () tạo ra một hàm băm mật khẩu mới của chuỗi bằng một trong các thuật toán băm có sẵn.