Hướng dẫn how secure is php code? - mã php an toàn như thế nào?

Nếu bạn viết đủ mã, bạn sẽ vô tình viết một lỗ hổng tại một số điểm trong sự nghiệp của bạn với tư cách là một nhà phát triển. Phần này của Trung tâm học tập WordFence được thiết kế để giúp bạn với tư cách là người mới bắt đầu hoặc nhà phát triển cấp độ nâng cao giảm xác suất bạn sẽ phát hành lỗ hổng vào sản xuất.

Chúng tôi sẽ làm điều này bằng cách bắt đầu với một cái nhìn tổng quan về khái niệm về bảo mật PHP. Sau đó chúng tôi sẽ khám phá các loại lỗ hổng với các ví dụ. Trong các phần sau, chúng tôi sẽ cung cấp cho bạn một vài công cụ để giúp bạn phát hiện các lỗ hổng trong mã của bạn. Chúng tôi khuyên bạn nên đi qua từng bài viết để xây dựng một kiến ​​thức nền tảng vững chắc mà bạn có thể xây dựng khi bạn tiến bộ. Thời gian bạn đầu tư vào đây sẽ có lợi cho bạn và người dùng các ứng dụng web của bạn trong nhiều năm để giúp bạn tạo các ứng dụng PHP an toàn hơn.

Phần lớn lời khuyên chúng tôi cung cấp là áp dụng cho sự phát triển PHP nói chung, nhưng chúng tôi bao gồm các chức năng và ví dụ trong các bài viết dành riêng cho phát triển WordPress.

Ngay cả khi bạn không viết các ứng dụng WordPress, chúng tôi khuyến khích bạn đọc các bài viết này vì chúng sẽ cung cấp cho bạn một nền tảng tuyệt vời để viết mã PHP an toàn. Nếu sau đó bạn quyết định tham gia cộng đồng WordPress và viết plugin đầu tiên của bạn, bạn sẽ có thể tạo mã an toàn chất lượng cao sẽ giúp bạn bè trong cộng đồng và làm cho mã của bạn có giá trị hơn đối với nhà tuyển dụng và khách hàng của bạn.

Bài viết giới thiệu này sẽ cung cấp cho bạn sự hiểu biết về khái niệm về cách các lỗ hổng được đưa vào mã PHP nói chung và các plugin WordPress nói riêng.

Các lỗ hổng ở đâu và tại sao xuất hiện trong WordPress

WordPress như một nền tảng xuất bản bao gồm WordPress Core, là hệ thống quản lý nội dung cốt lõi. Điều này bao gồm mã PHP, HTML, mã JavaScript và quy tắc CSS. Mã WordPress Core, được kiểm tra thường xuyên bởi cộng đồng nguồn mở. Như Eric Raymond nói trong nhà thờ và chợ,WordPress core, which is the core content management system. This consists of PHP code, HTML, javascript code and CSS rules. WordPress core’s code is inspected often by the open source community. As Eric Raymond says in the Cathedral and the Bazaar,

“Cho đủ nhãn cầu, tất cả các lỗi đều nông cạn”

Nói cách khác, có rất nhiều người nhìn vào Core WordPress ngày nay, nó không có khả năng ai đó đã giành được thông báo về một lỗi hoặc lỗ hổng, báo cáo và nhận tín dụng cho nó.

Một trang web WordPress cũng bao gồm một chủ đề chủ yếu là HTML, CSS và JavaScript và thường bao gồm một lượng nhỏ mã PHP. Các trang web không thay đổi chủ đề thường xuyên khi họ đã cài đặt chúng, vì vậy các lỗ hổng hoặc lỗi mới không có khả năng được đưa vào chủ đề trang web. Các chủ đề don don thường chứa nhiều mã PHP và độ phức tạp của mã thấp.a theme which is mostly HTML, CSS and javascript and usually includes a small amount of PHP code. Sites don’t change their themes often once they’ve installed them, so new vulnerabilities or bugs are not likely to be introduced into a site’s theme. Themes don’t usually contain much PHP code and the code complexity is low.

Chỉ với Core WordPress và một chủ đề, bạn có một trang web cơ bản cung cấp chức năng thông thường mà WordPress bao gồm. Cho đến nay, bạn đã giới thiệu nhiều mã PHP mới vào hệ thống. Bằng cách thêm các plugin WordPress, một trang web có được các tính năng và hành vi mới phức tạp. Các plugin WordPress có thể bao gồm:WordPress plugins, a website gains complex new features and behaviors. WordPress plugins may include:

  • Nhận xét Bộ lọc thư rác như Akismet
  • Các nền tảng thương mại điện tử như WooC Commerce
  • Hệ thống đấu giá để biến trang web của bạn thành một loại ebay
  • Các plugin bảo mật như wordfence

Có hơn 50.000 plugin trong kho lưu trữ plugin chính thức của WordPress với hơn 1 tỷ tổng số lượt tải xuống. Họ cung cấp một loạt các chức năng cho các trang web WordPress.

Các plugin WordPress bao gồm một lượng lớn mã PHP - trên thực tế, chúng chủ yếu là PHP. Mức độ phức tạp của mã PHP trong một plugin cũng cao. Điều này làm cho chúng có nhiều khả năng chứa các lỗ hổng.

Hầu hết các lỗ hổng được đưa vào WordPress thông qua các plugin. Bạn có thể thấy điều này trong hành động nếu bạn xem wpvulndb.com, nơi duy trì cơ sở dữ liệu về các lỗ hổng WordPress. Như bạn có thể thấy, có một số ít các lỗ hổng được báo cáo hàng năm trong Core WordPress và trong các chủ đề, trong khi các plugin cung cấp một luồng báo cáo lỗ hổng liên tục. You can see this in action if you view WPVulnDB.com, which maintains a database of WordPress vulnerabilities. As you can see there are a handful of vulnerabilities reported every year in WordPress core and in themes, while plugins provide a constant stream of vulnerability reports.

Bởi vì các plugin cho đến nay là nguồn lỗ hổng mới lớn nhất trong WordPress, chúng tôi sẽ dành một chút thời gian trong các hướng dẫn của mình để viết mã PHP an toàn tập trung vào các plugin WordPress và cách cải thiện bảo mật của chúng.

Nguyên tắc cơ bản của viết mã PHP an toàn

Không bao giờ tin tưởng vào đầu vào của người dùng

Nếu bạn có thể ghi nhớ dòng trên, không bao giờ tin tưởng vào đầu vào của người dùng và kết hợp nó vào các hoạt động mã hóa hàng ngày của bạn, bạn đã đi được nửa chừng để viết mã PHP an toàn hơn. Phần lớn các lỗ hổng trong mã PHP được gây ra bởi một nhà phát triển không tin tưởng đúng vào đầu vào người dùng. Nói cách khác, nhà phát triển không bao gồm mã để vệ sinh chính xác hoặc đủ một số hình thức đầu vào của người dùng.

Trong lỗ hổng Akismet được báo cáo vào tháng 10 năm 2015, Akismet đã không vệ sinh chính xác đầu vào của người dùng thông qua các nhận xét, dẫn đến lỗ hổng kịch bản chéo trang web [XSS].

Vào tháng 8 năm 2015, một lỗ hổng trong Core WordPress đã được phát hiện trong đó WordPress Core đã tin tưởng vào đầu vào của người dùng để cung cấp ID POST hợp lệ, mà không cần xác minh nó. Người dùng cấp cấp của người đăng ký có thể sử dụng ID POST không hợp lệ [cùng với điều kiện cuộc đua] để nâng mức đặc quyền của họ lên mức truy cập cao hơn. Nếu Core đã kiểm tra chính xác xem một bài đăng có tồn tại hay không trước khi kiểm tra xem người dùng có mức độ truy cập chính xác hay không, thì lỗ hổng có thể tránh được không. Chúng tôi khuyến khích bạn đọc tiết lộ lỗ hổng trong trường hợp sau vì nó sẽ cho bạn một ý tưởng tốt về việc mã của bạn có thể được xem xét kỹ lưỡng như thế nào. [Gợi ý: Rất chặt chẽ. Đây là một lỗ hổng cực kỳ tiên tiến]

7 lỗ hổng plugin gần đây nhất tại thời điểm viết, tất cả đều được gây ra bởi đầu vào người dùng tin cậy không chính xác. Chúng là các lỗ hổng XSS, CSRF, RFI hoặc SQL, tất cả đều được gây ra bởi nhà phát triển không vệ sinh chính xác đầu vào của người dùng trước khi sử dụng nó trong ứng dụng hoặc không vệ sinh đầu ra trước khi được gửi đến trình duyệt web.

Hãy nhớ rằng câu nói này: Viên vệ sinh đầu vào sớm, vệ sinh đầu ra muộn

Các ứng dụng của chúng tôi không hữu ích lắm nếu không có đầu vào của người dùng dưới dạng bình luận, bài đăng trên blog, xếp hạng sao, hình thức mà khách truy cập điền vào và như vậy. Khi dữ liệu đến trong ứng dụng web của bạn từ trình duyệt của khách truy cập trang web, nó cần phải được vệ sinh khi nó đến. Bạn phải đảm bảo rằng bạn vệ sinh nó ngay khi nó đến hoặc càng sớm càng tốt trước khi các phần khác của ứng dụng tương tác với dữ liệu.early as possible before other parts of the application interact with the data.

Các ứng dụng web của chúng tôi cũng thú vị hơn nhiều khi họ có thể chia sẻ đầu vào của người dùng với khách truy cập trang web khác bằng cách gửi lại cho trình duyệt web. Chúng tôi có thể hiển thị nhận xét, hiển thị các bài đăng được xuất bản, chia sẻ kết quả khảo sát với khách truy cập trang web khác, v.v. Tất cả dữ liệu này được lưu trữ đầu vào người dùng đang được xuất vào trình duyệt. Ngay cả khi bạn đã vệ sinh dữ liệu này khi nó xuất hiện, nó cần phải được an toàn khi nó được hiển thị cho khách truy cập trang web khác.output to the browser. Even if you’ve sanitized this data as it arrives, it needs to be re-sanitized when it is displayed to other site visitors.

Khi bạn vệ sinh đầu ra, bạn cần vệ sinh càng muộn càng tốt. Bằng cách đó, bạn có thể chắc chắn rằng nó không được sửa đổi sau khi nó được vệ sinh và bạn chỉ vệ sinh nó một lần: ngay trước khi nó được gửi đến trình duyệt web. Đó là lý do tại sao chúng tôi đã phát minh ra câu nói ở trên: vệ sinh đầu vào sớm, vệ sinh đầu ra muộn. Sử dụng điều này như một lời nhắc bạn cần vệ sinh dữ liệu người dùng ngay khi nó đến và một lần nữa ngay trước khi nó rời đi.sanitize as late as possible. That way you can be sure that it is not modified after it is sanitized and you only sanitize it once: right before it is sent to the web browser. That is why we invented the saying above: Sanitize input early, sanitize output late. Use this as a reminder you need to sanitize user data once as soon as it arrives and again right before it leaves.

Đôi khi bạn không kiểm soát đầu vào

Đôi khi bạn có thể nhận dữ liệu đầu vào của người dùng từ API hoặc nguồn cấp dữ liệu vào ứng dụng của bạn. Bạn có thể dựa vào một ứng dụng khác để vệ sinh dữ liệu cho bạn. Lý tưởng nhất là bạn sẽ phân tích lại bất kỳ dữ liệu nào trong ứng dụng của bạn, nhưng điều này không phải lúc nào cũng khả thi vì lý do hiệu suất hoặc vì dữ liệu lớn và phức tạp và nó sẽ đòi hỏi nhiều mã để vệ sinh nó.

Trong trường hợp này, bạn cần nhớ, ít nhất, vệ sinh đầu ra. Thật dễ dàng để quên rằng dữ liệu bạn đang nhận được từ một nơi nào đó khác ngoài ứng dụng của bạn cũng có thể là dữ liệu đầu vào của người dùng và có thể chứa mã độc hại.

Đôi khi bạn không kiểm soát đầu ra

Thỉnh thoảng bạn có thể nhận được dữ liệu từ người dùng trên trang web của mình và gửi nó đến một ứng dụng bên ngoài thông qua, ví dụ, API REST mà bạn đã xuất bản. Đảm bảo rằng bạn vệ sinh tất cả các đầu vào của người dùng sớm, vì nó xuất hiện trong ứng dụng của bạn trước khi bạn gửi nó qua API.

Bằng cách này, bạn giúp giữ cho người dùng dữ liệu của bạn an toàn. Bạn không nên cho rằng các nhà phát triển sử dụng API của bạn đang vệ sinh dữ liệu ở cuối của họ và bạn có thể gửi cho họ đầu vào người dùng thô.

Cách vệ sinh, xác thực và thoát ra đầu vào

Trong các cuộc thảo luận trên, chúng tôi sử dụng thuật ngữ 'vệ sinh' hoặc 'vệ sinh' như một thuật ngữ toàn cầu để mô tả ý tưởng đảm bảo rằng dữ liệu của bạn đến một ứng dụng an toàn cho ứng dụng tương tác và dữ liệu rời khỏi [được xuất ra] là an toàn cho tiêu dùng.

Có ba cách để đảm bảo dữ liệu an toàn:

  • Xác thực: Xác thực đảm bảo rằng bạn có đúng loại dữ liệu. Ví dụ: bạn có thể đảm bảo rằng một trường chỉ định một số mục trong giỏ hàng là một số nguyên bằng cách sử dụng hàm PHP tựa is_numeric []. Nếu nó trả về sai thì bạn sẽ gửi lỗi lại cho trình duyệt yêu cầu họ cho một số nguyên hợp lệ. Khi bạn kiểm tra đầu vào cho dữ liệu hợp lệ và trả về thông báo lỗi cho người dùng, đó là xác thực.Validation makes sure that you have the right kind of data. For example, you might make sure that a field specifying a number of items in a cart is an integer by using PHP’s is_numeric[] function. If it returns false then you send an error back to the browser asking them for a valid integer. When you test input for valid data and return error messages to the user, that is validation.
  • Vệ sinh: Điều này loại bỏ bất kỳ dữ liệu có hại. Bạn có thể loại bỏ các thẻ từ dữ liệu biểu mẫu. Hoặc bạn có thể xóa trích dẫn khỏi thuộc tính HTML trước khi gửi nó đến trình duyệt. Đây là tất cả việc vệ sinh vì nó loại bỏ dữ liệu có hại.This removes any harmful data. You might strip out tags from form data. Or you might remove quotes from an HTML attribute before sending it to the browser. This is all sanitization because it removes harmful data.
  • Thoát khỏi: Điều này lấy bất kỳ dữ liệu có hại và làm cho nó trở nên vô hại. Ví dụ: bạn có thể thoát khỏi thẻ HTML trên đầu ra. Nếu ai đó bao gồm một thẻ có thể dẫn đến lỗ hổng XSS, bạn có thể xuất nó là & lt; script & gt; nơi bạn đã thoát khỏi các dấu hiệu lớn hơn và ít hơn để làm cho nó trở nên vô hại.This takes any harmful data and makes it harmless. For example, you might escape HTML tags on output. If someone includes a tag which can result in an XSS vulnerability, you might output it as where you have escaped the greater and less than signs to make it harmless.

Các thói quen xác nhận thường được sử dụng trong một tuyên bố có điều kiện, ví dụ: routines are normally used in a conditional statement e.g.

if[filter_var[$address, FILTER_VALIDATE_EMAIL]]{ 
 echo "Email is valid."; 
} else { 
 echo "Not valid."; 
}

Vệ sinh lấy một số dữ liệu và làm sạch nó cho bạn, trả lại phiên bản sạch. ví dụ. takes some data and cleans it for you, returning the clean version. e.g.

//Remove all characters from the email except letters, digits and !#$%&'*+-=?^_`{|}~@.[] 
   echo filter_var[$dirtyAddress, FILTER_SANITIZE_EMAIL];

Thể hiện các thói quen làm cho dữ liệu có khả năng có hại an toàn. Chúng thường được sử dụng như sau:routines make potentially harmful data safe. They are frequently used as follows:

Bài Viết Liên Quan

Chủ Đề