2009-06-13 36 views
5

Trình đọc lần đầu, áp phích lần đầu (woo!)Rủi ro bảo mật trong việc lưu trữ thông tin đăng nhập SQL trong mã PHP?

Vì vậy, tôi đã triển khai tập lệnh đăng nhập của mình cho một trang web không chính thức. Không có khả năng bị tổn hại, nhưng chỉ để được an toàn, tôi muốn hỏi nếu có một nguy cơ bảo mật trong việc đăng nhập cơ sở dữ liệu MySQL của tôi được lưu trữ trong bản rõ trong mã php. Theo như tôi biết, bản thân mã được phân tích bởi Apache, vì vậy người dùng cuối không nhìn thấy nó (chỉ là đầu ra), điều đó có nghĩa là nó sẽ an toàn để giữ ... nhưng tôi muốn như ý kiến ​​thứ hai.

Tóm tắt: Truy cập cơ sở dữ liệu qua mysql_connect, mysql_select_db, mysql_query. Thông tin đăng nhập được lưu trữ trong các biến cục bộ được xác định tại mỗi lần lặp của tập lệnh và (tôi nghĩ) được bán phá giá khi tập lệnh chấm dứt.

Lỗ hổng bảo mật?

Trả lời

10

Bạn cũng có thể xem xét di chuyển kết hợp tên người dùng/mật khẩu sang tệp cấu hình riêng biệt nằm bên ngoài webroot. Đảm bảo rằng địa điểm không thể truy cập trực tiếp từ phía máy chủ web.

Bằng cách đó, nếu vì lý do nào đó, máy chủ web quyết định không thực thi các tệp PHP nữa, bạn không mất thông tin tài khoản cho máy chủ cơ sở dữ liệu. Là một phần thưởng thêm, nếu bạn sử dụng bất kỳ thứ gì tạo bản sao tệp .php (trình soạn thảo, SVN hoặc bất kỳ thứ gì) trong webroot, bạn không có nguy cơ gặp phải bất kỳ ai xung quanh việc thực thi .php.

+6

Sự thật. Khi tôi lần đầu tiên bắt đầu sử dụng Linux, đã không thông báo Gedit thực hiện filename.ext ~ và khi tôi tải lên thư mục, các tập tin ~ sẽ đi với nó. Sau đó, tôi có thể đi đến mysite.com/index.php~ và có nó trong văn bản gốc – sqram

+2

@lyrae: Tôi ... chúa tốt, cảm ơn bạn đã chỉ ra rằng. Tôi không biết ... O.o * chạy và xóa * –

+0

Nếu bạn hoàn toàn phải có mật khẩu trong tệp PHP, thì ít nhất là sha1 hoặc md5 nó. – Shoan

0

Bất kỳ ai có thể đăng nhập bằng đặc quyền root trên máy chủ web đó (hoặc có thể có phần thấp hơn) đều có thể nhìn thấy mật khẩu của bạn - nhưng sau đó, về cơ bản không thể bảo vệ chống lại siêu người dùng (bất cứ nơi nào bạn có thể giữ mật khẩu của bạn, họ có thể hack xung quanh và tìm thấy nó). Ngoài rủi ro này, bạn nên an toàn.

Chỉnh sửa: bản sao lưu của máy chủ cũng có thể được sử dụng (nếu không được mã hóa hoặc bởi ai đó có thể giải mã chúng) để khôi phục mật khẩu của bạn nếu mật khẩu trong tập lệnh .php không rõ ràng. Cuộc tấn công này có thể có thể được giảm nhẹ (với sự bất tiện lớn/chi phí) bằng cách giữ mật khẩu trên một vị trí an toàn khác, và chỉ gửi nó (an toàn) trong những trường hợp rất hạn chế. Đây có phải là loại tấn công bạn sợ không?

7

Quy trình rất chuẩn cho các ứng dụng web nói chuyện với cơ sở dữ liệu.

Tôi khuyên bạn nên lấy quyền đọc từ tệp cho người dùng không phải máy chủ web và chính bạn - nếu bạn có người dùng khác trên hộp có thể gián điệp tệp, họ sẽ có thể truy cập máy chủ mysql của bạn.

Ngoài ra, bạn nên điều chỉnh quyền thực thi trên thư mục trên cùng vì nó sẽ ngăn người dùng trái phép thậm chí nhập nó.

Làm cứng máy chủ lưu trữ được phép của người dùng mysql, để chỉ các hộp bạn cần có thể kết nối với nó.

Tất nhiên nếu hộp của bạn bị xâm phạm và kẻ tấn công có quyền truy cập root, có rất ít thứ sẽ bảo vệ bạn.

+2

+1 - Nó cũng sẽ là một ý tưởng tốt để đảm bảo người dùng MySql không có đặc quyền như thả/cấp vv – karim79

1

Bạn có thể thêm một số lớp bảo mật bổ sung bằng cách đặt tất cả các tệp php của bạn (ngoại trừ index.php của khóa học) trong một thư mục riêng biệt và bảo vệ chúng bằng tệp .htaccess. Điều này bao gồm các trường hợp trong đó trình phân tích cú pháp php không được gọi và apache trả về các tệp trong văn bản rõ ràng. Một điều nữa có thể hữu ích: <?php defined('some_id_here') or die(); ?>. Bạn có thể đặt nó ở đầu mỗi tập tin php ngoại trừ chỉ mục.php (nơi bạn định nghĩa some_id_here) để không có quyền truy cập trực tiếp vào các tệp cơ sở dữ liệu của bạn.

+0

Có ai từng thấy một cá thể Apache được cấu hình đúng cách không gọi trình phân tích cú pháp PHP. –

+0

OK bạn đã đúng. Tôi có nghĩa là những điều giả định như thế này tất nhiên KHÔNG BAO GIỜ xảy ra trong cuộc sống thực, nhưng tôi nghĩ nó đáng nói đến. Vì vậy, một tìm kiếm google như "echo filetype: php" tiết lộ không có gì VÀ tôi không tìm thấy bất cứ điều gì như thế này http://tppserver.mit.edu/index.php3 dẫn tôi đến http://tppserver.mit.edu/tpp_www .inc: o) haha ​​ – merkuro

+0

Tôi tin rằng nó đã xảy ra với facebook trong quá khứ gần đây. http://www.phpdeveloper.org/news/8433 – Shoan

1

Không có số lượng lớn mã trong webroot, nơi có thể, tuy nhiên, không chắc, chỉ là hàng phòng thủ đầu tiên có thể được thực hiện.

Cơ sở dữ liệu của bạn cũng phải được bảo mật ngay cả khi người dùng và mật khẩu cơ sở dữ liệu được xuất bản - bởi đơn giản là chỉ cho phép một số lượng nhỏ máy nguồn kết nối với cơ sở dữ liệu.

Defense in Depth

<?php // simplest /index.php, as the only .PHP file in the public-accessible webroot 
require '../bootstrap.php'; 
+0

Chỉ hoạt động nếu máy chủ web của bạn không phải là điều ác và buộc bạn phải đưa mọi thứ ra ngoài. – jmucchiello

+2

... và như vậy chỉ khi bạn đưa tiền của bạn cho một công ty webhosting moronic. –

1

Tôi không biết làm thế nào bạn kết nối với cơ sở dữ liệu MySQL của bạn, nhưng nếu bạn sử dụng PDO có khả năng rằng các nhà xây dựng PDO ném một ngoại lệ. Nếu bạn không nắm bắt ngoại lệ này, Công cụ Zend sẽ hiển thị một backtrace theo mặc định và tiết lộ chi tiết kết nối của bạn!

Nó chỉ là bình thường để lưu trữ các kết nối creds bên trong một tập tin php/biến hoặc, trong trường hợp đó bạn sử dụng PDO, trong DSN (Data Source Name). Tôi thậm chí sẽ đề nghị bạn đặt nó bên trong một tập tin php, bởi vì nó sẽ được phân tích và không gửi đồng bằng vào ...

Một bước để an toàn hơn là đặt chi tiết đăng nhập bên ngoài www-root hoặc bảo vệ nó với một tập tin .htaccess (điều này sẽ làm cho nó không thể truy cập các tập tin thông qua máy chủ web).

Tuy nhiên trên máy chủ của tôi không thể kết nối không từ máy chủ cục bộ. Vì vậy, tôi không quan tâm nếu ai đó đọc chi tiết đăng nhập của tôi (nó không phải là trường hợp của khóa học.).

+0

Điểm tốt. Tôi nên cấu hình cơ sở dữ liệu của mình để chỉ chấp nhận các kết nối cục bộ, vì đó chính xác là cách tôi đã thiết lập. Chúc mừng! –

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