10 Bước thiết lập bảo mật cho website PHP

Đăng ngày: 19 Tháng 11 2014
Đánh giá bài này
(1 Bình chọn)
10 Bước thiết lập bảo mật cho website PHP 10 Bước thiết lập bảo mật cho website PHP

Vì lí do an toàn, bạn có lo lắng khi để site PHP của bạn trực tuyến?  Chúng tôi đã từng thế cũng từng lo sợ khi đọc những câu chuyện về các trang web bị tấn công, dữ liệu người dùng bị rò rỉ và nhiều hơn như vậy.

Có lẽ tất cả các trang web đều có thể bị hack, không kể nó được bảo vệ tốt như thế nào. Tuy nhiên, có một vài biện pháp an ninh quan trọng trong code sẽ giảm được tỉ lệ xác suất mất an toàn, và nó không khó để thực hiện. Dưới đây là 10 lời khuyên quan trọng nhất giúp mã PHP của bạn an toàn:

1.  Xác nhận đầu vào là số

Hầu hết các hướng dẫn nói về việc chứng thực đầu vào người sử dụng nói chung. Tôi thích phân chia các xác nhận này tùy thuộc vào loại đầu vào. Khi bạn biết những loại đầu vào bạn cần nó sẽ rất dễ để bảo vệ mã của bạn từ các cuộc tấn công độc hại như SQL injections, XSS và vv.).

Thông thường các trang web PHP dựa trên truyền tham số URL. Trái ngược với quan điểm phổ biến, không có gì sai về việc chuyển ID sản phẩm của bạn hoặc ID người sử dụng trong URL. Bạn chỉ cần chắc chắn rằng ID là số thực:

1. $ id = intval ($ _ GET ['id']);

Đây thực sự là tất cả điều bạn cần. Nếu người dùng đã truyền một số SQL injection hoặc bất cứ điều gì như thế trong URL nó sẽ đơn giản là được chuyển đổi sang 0. Ngoài ra, nếu bạn thích sẽ có đầu ra một thông điệp lỗi:

1.if(!is_numeric($_GET['id'])) die("ID parameter must be numeric");

Tôi thích cách tiếp cận đầu tiên bởi vì cách thứ hai giúp kẻ tấn công biết rằng bạn đang xác nhận ID và chúng sẽ nhanh chóng quyết định thử một cái khác.

2.  Xác nhận đầu vào là văn bản

Đầu vào bằng chữ thì khó xác nhận hơn bởi vì bạn không biết chính xác những gì sẽ diễn ra. Các hành động  thông thường và đơn giản là giải thoát đầu vào trước khi chèn nó vào DB. Bạn có thể làm điều này với mysql_real_escape_string hoặc một chức năng tương tự. Tuy nhiên, nếu bạn biết những gì dữ liệu bạn cần, tốt hơn để sử dụng chức năng  filter_var () với các bộ lọc thích hợp nhất. Ví dụ, bạn có thể làm sạch email của người dùng được nhập vào một hình thức như thế này:

1. $ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL);

Quy tắc là giới hạn một cách nghiêm ngặt đầu vào với những gì bạn cần.

3.  Xác nhận đầu vào html

Đôi khi bạn muốn người dùng nhập đầu vào mã HTML nhiều định dạng - ví dụ như khi bạn sử dụng một số loại biên tập phong phú trong một hộp văn bản. Rõ ràng trong trường hợp này, điều duy nhất bạn có thể làm để tránh SQL injection là để thoát khỏi đầu vào với mysql_real_escape_string hoặc một cái gì đó tương tự. Bạn không nên loại bỏ ký tự đặc biệt bởi vì họ có thể là một phần của định dạng HTML.

Tuy nhiên có hai điều chắc chắn: bạn không muốn người dùng gắn thẻ script và bạn không muốn họ gắn khung bên trong. Cả hai cái này đều có thể không an toàn khi hiển thị trên trang web của bạn. Vì vậy, hãy chắc chắn rằng bạn không để cho loại nội dung đó được chấp nhận:

1.If (stristr ($ _ POST ['input'], "<iframe") hoặc stristr ($ _ POST ['input'], "<script")) die ("Chúng tôi không thể chấp nhận đầu vào của bạn!");

4.  Ngăn chặn xss injections

Nếu bạn muốn có một kiến thức thực sự chi tiết về các cuộc tấn công cross-site scripting, và muốn trở thành chuyên gia trong việc ngăn chặn chúng, tôi khuyên bạn nên kiểm tra hướng dẫn thực sự tuyệt vời này. Và đừng quên để tải về cheat sheet. Đối với phần chúng ta có một giải pháp đơn giản và thường là đầy đủ như sau:

1.echo htmlspecialchars ($ _ POST ['input']);

Luôn làm điều này khi bạn cần phải xuất ra đầu vào của người dùng trên màn hình. Trừ khi bạn muốn người dùng nhập đầu vào những chữ có nhiều định dạng - trong trường hợp này kiểm tra 3 bí quyết dưới bắt đầu từ bí quyết này trở đi.

5.  Không để lộ các lỗi mysql

Đây là một việc đơn giản. Đơn giản không làm điều này:

1.mysql_query ($ sql) or die (mysql_error ());

Bạn không muốn hiển thị lỗi SQL cho tất cả mọi người. Chưa kể rằng sử dụng mysql_query () trực tiếp trong mã của bạn là ngớ ngẩn. Bạn phải sử dụng mysqli đã được cải thiện, và bạn cần một cái vỏ cơ sở dữ liệu. Cái vỏ cơ sở dữ liệu của bạn nên đăng nhập vào các lỗi thay vì trực tiếp xuất chúng trên màn hình.

6.  Không cho phép kết nối cơ sở dữ liệu bên ngoài

Một mẹo đơn giản khác. Nhiều lập trình viên bị ám ảnh với việc ẩn tập tin của họ với chi tiết kết nối cơ sở dữ liệu bên ngoài thư mục gốc. Việc này không thuận lợi bởi vì nó làm cho việc di chuyển các trang web trở nên khó khăn hơn. Đó là gần như không thể nếu bạn tạo ra các hộp thoại scripts, bởi vì bạn không muốn khách hàng của bạn đối phó với sự phức tạp của việc cài đặt các tập tin trên thư mục khác nhau, lo lắng về đường dẫn máy chủ, vv

Việc không cho phép kết nối cơ sở dữ liệu từ máy chủ khác dễ dàng hơn là từ máy chủ địa phương. Cách này, ngay cả khi ai đó quản lý để tải tập tin cấu hình của bạn, họ sẽ không thể làm bất cứ điều gì với nó.

Tuy nhiên, đừng quên rằng tập tin kết nối cơ sở dữ liệu của bạn nên có phần mở rộng .php. Đừng làm những điều ngu ngốc tạo ra các tập tin với tên như db-connect.inc. Nó có thể được xem hoặc tải về từ trình duyệt.

7.  Xây dựng bảo vệ thư rác

Spam - bản thân nó thường không được xem chính xác là một vấn đề bảo mật. Nhưng nó đúng là như vậy. Đặc biệt khi số lượng comment spam lớn thì việc bắt đầu tạo ra quá nhiều email hay các truy vấn cơ sở dữ liệu sẽ khiến site của bạn đi xuống. Vì vậy hãy quan tâm tới:

a) Thực hiện xác thực

b) Xác nhận đầu vào là người sử dụng cho các thư rác – dọn dẹp spam, kiểm tra URL trong comment vv

c) Ngăn chặn hoạt động bất thường từ một người sử dụng. (Ví dụ nếu bạn thấy có ai đó đăng 10 ý kiến trong một phút, đó rõ ràng không phải con người)

8.  Kiểm tra loại định dạng của file được tải lên

Khi cho phép người dùng tải lên các tập tin luôn luôn chắc chắn rằng chúng nằm trong các định dạng cho phép. Ví dụ, bạn chắc chắn không muốn người dùng upload file PHP cho avatar. Vẫn có thể kiểm tra phần mở rộng tập tin bởi vì ngay cả nếu một tập tin PHP được đổi tên thành .png nó sẽ không chạy khi truy cập trong trình duyệt. Vì vậy, bạn có thể làm một cái gì đó như thế này:

1.$allowed_file_types = array("png", "jpg", "gif");
2.$parts = explode(".", $_FILES['uploaded_file']['name'];
3.$extension = array_pop($parts);
4.$extension = strtolower($extension);
5.if(!in_array($extension, $allowed_file_types)) die("Error!");

Nhưng nếu bạn muốn có một kiểm tra thực sự sâu sắc, bạn nên sử dụng lớp FileInfo.

9.  Kiểm tra người sở hữu dữ liệu

Đây là một trong những điều quan trọng nhất để thực hiện trong trang web cho phép thành viên của họ làm việc với dữ liệu. Một ví dụ đơn giản sẽ là một trang web cộng đồng mà mỗi người dùng có sở hữu bookmarks của riêng họ. Thông thường khi chọn bookmark của họ, bạn sẽ làm một cái gì đó như thế này:

1.SELECT * FROM  bookmarks WHERE user_id=$user_id
(tất nhiên sau khi xác nhận rằng $ user_id là một con số)

Hầu hết các nhà phát triển làm điều này –một cách  rõ ràng, nếu không họ sẽ không thể để chọn bookmarks thích hợp.

Nhưng sau đó khi xóa một bookmark nhiều nhà phát triển phạm sai lầm sau đây:

1.DELETE FROM bookmarks WHERE id=$_GET[id]

Đây là một sai lầm lớn (chúng ta hãy giả sử rằng $ _GET ['id'] được kiểm tra là một số nguyên trước khi truy vấn). Bằng cách này, người ta có thể xóa bookmark của người khác miễn là họ biết ID. Hoặc họ chỉ có thể thả ID ngẫu nhiên để xóa chúng. Bạn nên luôn luôn đảm bảo rằng người sử dụng thao tác chỉ với dữ liệu riêng của họ:

1.DELETE FROM bookmarks WHERE id=$_GET[id] AND user_id=$user_id

10.  Những tập tin được bảo vệ? Từ chối từ tất cả

Đây không phải là một thứ liên quan đến PHP bởi vì bạn có thể sử dụng nó trong trang web bất kỳ. Ví dụ, nếu bạn đang chạy một trang web thành viên và cho phép người dùng trả tiền cho hình ảnh vector tải về, bạn nên chắc chắn rằng những hình ảnh được phục vụ bằng một kịch bản PHP và không phải bởi các liên kết tải về trực tiếp. Nếu không mọi người sẽ có thể truy cập các tập tin miễn là họ biết chúng đang ở đâu. Không chỉ bạn không nên tiếp xúc với các vị trí thư mục thật, mà bạn cũng nên làm cho nó hoàn toàn không thể truy cập từ trình duyệt. Một cách dễ dàng để làm điều này là bởi một tập tin .htaccess có chứa:

1.<Limit GET POST PUT>
2. order deny, allow
3.deny from all
4.</Limit>

Hãy thực hiện mười bước này để trang web của bạn sẽ được bảo mật tốt nhất. Hãy cho chúng tôi biết quan điểm của bạn như thế nào, cùng thảo luận và tìm giải pháp tối ưu nhất.

Với các lập trình viên, sử dụng các công cụ kiểm tra lỗi khi lập trình là một phần không thể thiếu, hiện nay có khá nhiều công cụ debug PHP được họ sử dụng, mỗi công cụ có một đặc điểm riêng phù hợp với mỗ trường hợp, bạn hãy tham khảo Những công cụ Debug PHP được sử dụng nhiều hiện nay để biết được công cụ nào thích hợp nhất với công việc của mình.

Gửi bình luận

Hãy nhập đầy đủ các thông tin yêu cầu trong ô có dấu (*). Không được phép sử dụng mã HTML.

LIKE để ủng hộ bạn nhé!

 

Tham gia diễn đàn seo hàng đầu Việt Nam

Has no content to show!