2009-12-27 34 views
10

Tôi có một tập tin config.php nơi tôi chỉ đơn giản là làm cho một mảng lớn có chứa tất cả các cấu hình khung. Ngoài ra, chuỗi nguồn cơ sở dữ liệu giống như "mysql: host = localhost; dbname = mydb" (tên được gọi là, btw?) Và tên người dùng + mật khẩu cho DB. Tôi sợ điều này là:Bạn lưu trữ các cấu hình tập lệnh PHP của bạn như dữ liệu truy cập DB ở đâu?

  1. ngu ngốc
  2. không tốt; giải pháp tốt hơn ở đó
  3. không an toàn (?)

vậy các chuyên gia PHP làm như thế nào?

+1

Tôi muốn nói nó được gọi là DSN. http://en.wikipedia.org/wiki/Database_Source_Name – joschi

+1

"chuỗi kết nối" có chung chung hơn DSN một chút. – VolkerK

+0

không gọi nó là 'config.php', tên đầu tiên mà một số phần mềm độc hại sẽ tìm kiếm. Gọi nó là 'hey-this-is-just-a-useless-file-i-swear-man.php' hoặc một cái gì đó tương tự;) – Strae

Trả lời

5

đó là cách hầu hết nó, nhưng bạn cũng có thể thử một số các giải pháp này:

  • Lưu file cấu hình bên ngoài thư mục web (điều này đòi hỏi cấu hình open_basedir trong PHP bị vô hiệu hóa).
  • Hạn chế truy cập đến tập tin cấu hình bằng cách sử dụng .htaccess:

    < Location /config.php > thứ tự từ chối, cho phép deny from all </Location >

  • Sử dụng.file ini và parse_ini_file chức năng (điều này là không thực sự là một giải pháp của riêng mình, nhưng có thể được kết hợp với những người khác)

+0

Tôi thích tùy chọn .htaccess. –

12

Nếu bạn có một www, httpdocs hoặc public_http thư mục hoặc một cái gì đó như thế, nơi ứng dụng php của bạn nằm, sau đó nó là thực hành tốt để đặt các tập tin cấu hình bên ngoài của thư mục đó, và chỉ cần truy cập vào nó như thế này:

include "../config.php"; 

Không ai có thể truy cập vào tệp đó mà không cần truy cập FTP và vì vậy nó tương đối an toàn so với việc có trong thư mục ứng dụng.

Nếu bạn không có thư mục như vậy, bạn có thể tạo một thư mục và tạo tệp .htaccess trong thư mục gốc, chuyển hướng tất cả các yêu cầu đến thư mục đó. Có nhiều cách khác nhau để làm điều đó, nhưng đó là một câu hỏi khác nhau tất cả cùng nhau.

+0

không may, gần 99,99% của tất cả các máy chủ ảo giá rẻ không cung cấp bất kỳ thư mục như vậy. Tất cả mọi thứ từ bên trong thư mục gốc đều có thể truy cập được và không có quyền truy cập ftp vào những gì ở trên gốc của web. – openfrog

+1

Trên thực tế, hầu hết các máy chủ 'rẻ' tôi đã có, đã cung cấp một thư mục như vậy dưới dạng này hay dạng khác. Đó cũng là sở thích của chủ nhà để làm như vậy. Nhưng hãy xem chỉnh sửa của tôi cho các tùy chọn. –

+0

@openfrog: một tuyên bố bạn có ở đó, bạn lấy dữ liệu từ đâu? –

6

Tôi lưu trữ nó trong tệp cấu hình kiểu văn bản thuần túy, thường nằm phía trên gốc web để không cho phép người dùng truy cập vào nó. Trong những trường hợp có thể truy cập được, tôi thường có tệp .htaccess với deny from all để ngăn chặn tất cả quyền truy cập vào nó.

Lưu trữ tệp đó trong tệp PHP có thể truy cập được đối với người dùng sẽ ổn, nhưng không lý tưởng. Nếu sever xử lý các tệp PHP một cách chính xác, ngay cả khi mọi người có thể truy cập tệp, họ không thể truy cập các giá trị vì chúng chỉ nhận được kết quả đầu ra (không có gì). Có tất nhiên các vấn đề với điều này, (xem ý kiến).
Sử dụng các tệp PHP là phương pháp phổ biến nhất với các dự án PHP (cả FOSS và thương mại) mà tôi đã sử dụng. Hầu hết trong số họ đều không lưu trữ chúng trên root web. Với bất kỳ thiết lập ổn định nào, có rất ít điểm trong việc lưu trữ tệp cấu hình của bạn phía trên gốc web, mặc dù được cung cấp Murphy's lawnó rất đáng làm nếu bạn có thể (Điều đó hoặc sử dụng .htaccess hoặc equilivent cho máy chủ của bạn từ chối người dùng truy cập vào một thư mục)

+2

"Lưu trữ nó trong một tập tin PHP nên được tốt." - Trừ khi một bản cập nhật phần mềm máy chủ web khác "phá hủy" cấu hình đặc biệt. .php-> application/x-httpd-php mapping ... một lần nữa. Điều này đã xảy ra trước đó (tại các công ty lưu trữ lớn hơn) và đột nhiên tất cả các tệp .php được gửi dưới dạng văn bản/đồng bằng: -S – VolkerK

+0

một lý do tại sao PHP chắc chắn nhất hút;) nhưng không có thay thế thực sự. vì vậy chúng tôi có thể bắt đầu làm xáo trộn mã của chúng tôi, huh? ;) – openfrog

+1

Điều đó không liên quan gì đến PHP, nhưng với số lượng máy chủ được cấu hình. Obfuscation sẽ giúp không, vì mật khẩu cần phải có ở một số dạng có thể đọc được để sử dụng nó để mở một kết nối. –

3

Tại sao lưu DB tên & mật khẩu trong "config.php" không phải là tốt? miễn là tôi biết, dữ liệu trong tệp này không thể được hiển thị công khai.

E.G.

<?php 
$DB_User = "amindzx"; 
$DB_Pass = "Something"; 

// connect to DB and so on. 
?> 

trừ khi nếu hacker có thể truy cập vào FTP của bạn.

1

Tại sao nó ngu ngốc để giữ tệp config.php đơn giản mà không có bất kỳ chứng khoán nào? Ngay cả khi lập trình viên tìm thấy tệp này, anh ta không thể làm gì cả, bởi vì, như amindzx đã nói "tệp này không thể hiển thị công khai." Hay tôi nhầm?

+0

Về cơ bản, không, nhưng cấu hình PHP của máy chủ có thể thay đổi và điều này có thể dẫn đến tệp trở nên hiển thị sau tất cả. –

+1

"nhưng cấu hình PHP của máy chủ có thể thay đổi", bạn có thể đưa ra ví dụ không? –

+0

Có một số trường hợp apache không hoạt động chính xác và cung cấp tệp php dưới dạng văn bản thuần túy. Điều này đã không xảy ra với tôi, nhưng tôi đã nghe những câu chuyện về điều này. – AntonioCS

0

Tôi thường lưu các thiết lập trong một config.php quá, chẳng hạn như các thiết lập kết nối cơ sở dữ liệu, đường dẫn tập tin, vv

1

Với thông tin nhạy cảm như cơ sở dữ liệu hoặc cổng thanh toán thông tin, và khi tôi có thể kiểm soát máy chủ, tôi thích để thêm các dòng như sau vào cấu hình máy chủ ảo apache của tôi:

SetEnv DB_USER "myuser" 
SetEnv DB_PASS "mypass" 

Trong PHP của bạn, bạn có thể truy cập chúng bằng $ _SERVER ['DB_USER']. Bạn có thể làm cho tập tin cấu hình này chỉ đọc được bởi root, mà bạn không bao giờ có thể làm với một tệp mà php truy cập vào lúc chạy. Một lưu ý: Hãy chắc chắn rằng bạn vô hiệu hóa php_info và không phơi bày các biến này với một cái gì đó ngớ ngẩn như print_r ($ _ SERVER). (Phần lớn điều này được diễn giải hoặc bị đánh cắp từ here.)

Đối với cấu hình không nhạy cảm, tôi muốn làm một lớp đầy đủ các hằng số, tương tự như thiết lập của bạn, nhưng tôi thích OOP-Ness của nó.

class Application 
{ 
    const CONTACT_EMAIL = "[email protected]"; 
} 

usage: 
$contactEmail = Application::CONTACT_EMAIL; 
+0

Đây là giải pháp tốt nhất để chia sẻ lưu trữ. – rogeriopvl

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