Những nhược điểm của PHP


Được đăng vào ngày 09/10/2016 | 0 bình luận
Đánh giá bài viết

PHP được sử dụng rất rộng, lý do là vì nó dễ dùng chứ không hẳn là nó tốt. PHP có rất nhiều nhược điểm, code PHP viết ra rất khó sửa đổi và nâng cấp sau này, hay thậm chí việc xóa bớt code cũng rất khó khăn. Dưới đây là một số nhược điểm lớn của PHP.

Code của PHP rất không an toàn.

Cú pháp của PHP buộc bạn phải chèn các giá trị vào trong câu truy vấn SQL, thay vì chèn bằng tham số như trong ASP.NET, Django, Node.js… do đó rất dễ bị tấn công bởi các kỹ thuật xưa cũ như SQL Injection hay Cross Site Scripting. Tất nhiên PHP biết rõ điều đó nên cũng có hàm cho bạn dùng để ngăn chặn các lỗ hổng đó, nhưng các hàm này được đặt tên rất dài và khó nhớ, và các hàm cũng không được đặt tên theo một quy tắc nào cả, chẳng hạn như htmlspecialchars() hay mysql_real_escape_string(), ngoài ra còn một kỹ thuật tấn công khác là Cross Site Request Forgery, đối với kỹ thuật tấn công này thì bạn phải tự code lấy phần bảo vệ chứ không có sẵn module nào cho bạn dùng cả.

Nếu trước đây bạn từng code những form như:

<input type="text" name="user" value="<?php echo $_REQUEST[user]; ?>">
<?php $result = mysql_query("SELECT * FROM users WHERE user='".$_REQUEST[user]."' AND pass='".$_REQUEST[pass]."'"); ?>

Thì 99% là user của bạn đã bị tấn công. Và bạn nên thay bằng đoạn code tương tự như sau:

<input type="text" name="user" value="<?php echo htmlspecialchars($_REQUEST[user]); ?>">
<?php $result = mysql_query("SELECT * FROM users WHERE user='" . mysql_real_escape_string($_REQUEST[user]) . "' AND pass='" . mysql_real_escape_string($_REQUEST[pass]) . "'"); ?>

Đây đều là những thứ cơ bản, hầu như bất cứ web framework nào cũng sẽ làm tự động cho bạn, nhưng PHP thì không, có lẽ vì nó quá cơ bản nên các coder phát triển PHP không thích làm chăng?

PHP đầy các lỗ hổng

Ví dụ chúng ta có đoạn code kiểm tra password đăng nhập như sau:

<?php
    if (strcmp($_POST['password'], 'sekret') == 0) {
        echo "Login successful!\n";
    } else {
         echo "Login failed!\n";
    }
?>

Chúng ta có thể phá đoạn code trên như sau:

$ curl -d password=sekret http://localhost/strcmp.php
Login successful!
$ curl -d password=wrong http://localhost/strcmp.php
Login failed!
$ curl -d password[]=wrong http://localhost/strcmp.php
Login successful!

Đây là lỗi xuất hiện ở phiên bản PHP 5.3, hàm strcmp() trong phiên bản này có chút thay đổi dẫn đến lỗi như trên, tuy nhiên việc thay đổi hàm này không được công bố khi phiên bản này được phát hành.

Tài liệu không an toàn

Ngay cả tài liệu chính thức của PHP trong phần hướng dẫn cách tránh kỹ thuật XSS cũng bị lỗ hổng XSS:

<?php
    echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>

Mặc định hàm htmlspecialchars() không chuyển đổi kí tự dấu nháy đơn, muốn chuyển thì bạn phải đưa vào một số hằng số vào hàm đó, nhưng trong ví dụ thì tại liệu này lại không làm vậy.

Tài liệu viết khó đọc

Thực ra thì cái này cũng tùy thuộc vào từng người nữa, nhưng theo mình thì tài liệu API của PHP giải thích về cách hoạt động con trỏ và tham chiếu rất khó hiểu.

Ngoài ra, chúng ta đều biết là lâu nay Facebook được viết bằng PHP, mặc nhiên chúng ta coi PHP là một thứ gì đó rất thần thánh, tuy nhiên vào năm 2014, Facebook đã đầu tư một đống tiền để phát triển một ngôn ngữ mới là Hack thay thế PHP, và hầu như là ngôn ngữ này sẽ được dùng để viết lại gần như toàn bộ Facebook.

Và một số bài viết khác chê bai PHP:







Trả lời


Lưu ý: bọc code trong cặp thẻ [code language="x"][/code] để highlight code.


Ví dụ:


[code language="cpp"]


    std::cout << "Hello world";


[/code]



Các ngôn ngữ được hỗ trợ gồm: actionscript3, bash, clojure, coldfusion, cpp, csharp, css, delphi, diff, erlang, fsharp, go, groovy, html, java, javafx, javascript, latex, matlab, objc, perl, php, powershell, python, r, ruby, scala, sql, text, vb, xml.

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *