2010-03-26 42 views
5

Tôi chỉ muốn biết một số kỹ thuật bảo mật PHP cơ bản mà tôi nên sử dụng khi tạo trang web chấp nhận bài viết là gì?Câu hỏi bảo mật PHP?

Tôi khá mới đối với PHP và tự hỏi điều gì sẽ giữ pháo đài cho đến khi tôi là chuyên gia bảo mật?

Trả lời

1

Điều này là rộng, có thể bạn nên cố gắng thu hẹp nó một chút.

Loại bảo mật nào? Đối với mật khẩu? Bạn có muốn hạn chế một số nội dung không? SQL Injection? Tiêm HTML? Bảo mật tên miền chéo?

+0

cho phép nói gửi dữ liệu như tên người, nội dung, v.v. – pHp

0

Có nhiều điều cần biết và bạn nên bắt đầu ngay khi có thể. Đối với một, nếu bạn chấp nhận bài viết (và có thể sử dụng WYSIWYG và đang chấp nhận HTML), hãy sử dụng nội dung nào đó để phân tích nội dung và loại bỏ những thứ có thể khiến bạn dễ bị XSS và những thứ tương tự.

Ví dụ là HTML Purifier.

5

Có hai mặt trận cần xem xét khi chấp nhận văn bản do người dùng tạo sẽ hiển thị sau này.

Trước hết, bạn cần phải bảo vệ cơ sở dữ liệu của bạn khỏi các cuộc tấn công tiêm. Có một hàm PHP đơn giản cho việc này: mysql_real_escape_string() thường sẽ đủ để bảo vệ cơ sở dữ liệu của bạn khỏi bị tiêm khi truyền chuỗi này vào để lưu trữ dưới dạng giá trị trường.

Từ đó, bạn phải cẩn thận về màn hình của mình, vì người dùng được phép tải lên mã HTML có thể làm những điều khó chịu với người dùng khác khi mã đó được hiển thị. Nếu bạn đang thực hiện các bài viết thuần túy, bạn có thể chỉ cần htmlspecialchars() văn bản kết quả. (bạn cũng có thể muốn chuyển đổi dòng mới thành các thẻ
.) Nếu bạn đang sử dụng giải pháp định dạng, chẳng hạn như công cụ Đánh dấu được sử dụng trên trang web này, các giải pháp đó thường sẽ cung cấp tính năng khử trùng HTML như một chức năng của động cơ. chắc chắn đọc tài liệu và đảm bảo.

Ồ, hãy đảm bảo bạn cũng đang xác minh các biến GET/POST được sử dụng để gửi các bài viết. Điều đó không cần phải nói và việc xác minh được thực hiện sẽ cần được điều chỉnh theo những gì trang web của bạn đang làm với logic của nó.

+0

Lưu ý: Tôi giả sử một cơ sở dữ liệu MySQL, có các hàm tương đương cho các kiểu cơ sở dữ liệu khác. –

+3

Các truy vấn tham số nên được sử dụng thay cho 'mysql_real_escape_string()' - http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements –

+1

mysql_real_escape_string() không bảo vệ bất cứ điều gì. Nó chỉ đơn thuần là một chức năng thoát đơn giản, và chỉ hoạt động khi kết hợp với dấu ngoặc kép. Vì vậy, quy tắc phải giống như "thoát dữ liệu của bạn với mysql_real_escape_string() ** và ** kèm theo nó trong dấu ngoặc kép". Phần còn lại là ok. –

1

Vâng, như đã đề cập trong các câu trả lời khác, có một số mặt trận khác nhau trong đó các tập lệnh PHP của bạn có thể bị xâm nhập.

Đây chỉ là một vài:

Có một số cách để đối phó với từng. Dưới đây là một số điều cần xem xét:

0

Nó có thể là khôn ngoan để bắt đầu bằng cách sử dụng một khuôn khổ như Drupal hoặc CakePHP.Bằng cách đó, bạn có thể học hỏi từ cách họ đã thực hiện bảo mật và tận dụng thực tế là nó đã được thực hiện. Đường cong học tập đủ dốc mà không cần phải cuộn cơ chế xác thực của riêng bạn.

-1

Khi dự án của bạn sẵn sàng để sử dụng công cộng, thường là một ý tưởng hay để đặt error_reporting (0);

Nó sẽ không cung cấp bảo mật hơn, nhưng nó làm cho nó khó khăn hơn nhiều (thường) cho kẻ xấu để tìm các vấn đề bảo mật có thể xảy ra với trang web của bạn.

+0

Đề xuất khủng khiếp. Đừng nhầm lẫn báo cáo lỗi ** cấp **, cần phải luôn cao nhất có thể, với báo cáo lỗi ** đích **, sẽ được chuyển từ hiển thị sang đăng nhập vào máy chủ sản xuất. –

+0

Vâng, ý tưởng của tôi là đúng hơn, người dùng thông thường sẽ không thấy thông báo lỗi. Việc cần làm với thông báo lỗi mà tôi tự quyết định, nhưng như bạn đã nói, tốt nhất là lưu trữ chúng. – Mikk

0

lẽ hai lời khuyên có thể giúp bạn có được các trang web an toàn hơn

  • tạo ra hai người dùng trong cơ sở dữ liệu của bạn, chỉ đọc tài khoản để thực hiện chỉ chọn lựa và đếm, và viết tài khoản khi bạn phải làm cập nhật, chèn hoặc xóa .
  • khi bạn phải chèn vào cơ sở dữ liệu hoặc xóa, khử trùng đầu vào, sử dụng mysql chuẩn bị báo cáo hoặc khẳng định giá trị mà đến qua đường bưu điện hoặc nhận được theo cách này:

    if(!empty($_GET["integer_like_id_value"]){ 
        $integer_id_value = (int)$_GET["integer_like_id_value"]; 
    }else{ 
        // that stuff seems not to be legit, die application, log error ? whatever 
        die(); 
    }