Htmlspecialchars($_server[php_self]) la gi

Khi bạn chèn BẤT KỲ biến nào vào HTML, trừ khi bạn muốn trình duyệt tự hiểu biến đó là HTML, tốt nhất bạn nên sử dụng biến htmlspecialchars()đó. Trong số những thứ khác, nó ngăn chặn tin tặc chèn HTML tùy ý vào trang của bạn.

Giá trị của $_SERVER['PHP_SELF']được lấy trực tiếp từ URL được nhập trong trình duyệt. Do đó, nếu bạn sử dụng nó mà không có htmlspecialchars(), bạn đang cho phép tin tặc thao túng trực tiếp đầu ra của mã của bạn.

Ví dụ: nếu tôi gửi email cho bạn một liên kết đến http://example.com/"><script>malicious_code_here()</script><span class="và bạn có <form action="<?php echo $_SERVER['PHP_SELF'] ?>">, kết quả đầu ra sẽ là:

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">

Kịch bản của tôi sẽ chạy, và bạn sẽ không phải là người khôn ngoan hơn. Nếu bạn đã đăng nhập, tôi có thể đã đánh cắp cookie của bạn hoặc lấy thông tin bí mật từ trang của bạn.

Tuy nhiên, nếu bạn đã sử dụng <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">, đầu ra sẽ là:

<form action="http://example.com/&quot;&gt;&lt;script&gt;cookie_stealing_code()&lt;/script&gt;&lt;span class=&quot;">

Khi bạn gửi biểu mẫu, bạn sẽ có một URL kỳ lạ, nhưng ít nhất thì tập lệnh ác của tôi đã không chạy.

Mặt khác, nếu bạn đã sử dụng <form action="">, thì kết quả đầu ra sẽ giống nhau cho dù tôi đã thêm gì vào liên kết của mình. Đây là tùy chọn tôi muốn giới thiệu.

25 hữu ích 1 bình luận chia sẻ

It sounds like you're confusing htmlspecialchars with urlencode.

htmlspecialchars replaces characters with special meaning in HTML with &-escaped entities. So, for example, ' becomes &#039;. It doesn't turn %22 into &quot;, however, because %22 has no special meaning in HTML, so it's safe to display it without modification.

urlencode replaces characters with special meaning in URLs with hexadecimal character codes using %. So, for example, " becomes %22.

If you want a form to be handled by the same URL that is used to display it, always use action="" rather than action=<?=$_SERVER['PHP_SELF']?> or action=<?=$_SERVER['REQUEST_URI']?>. As you've already figured out, there are serious risks of cross-site scripting (XSS) if you use either of the $_SERVER variables, because they contain user input and therefore cannot be trusted. So, unless you have a good reason that you need to tweak the URL somehow, just use action="".

Bài học này và những bài học kế tiếp sẽ hướng dẫn cách sử dụng form Validation.

Bài học này và các bài học tiếp theo sẽ hướng dẫn cách xử lý form PHP một cách an toàn để tránh khỏi những hacker và spammer. Form HTML mà ta sử dụng trong bài này chứa nhiều loại trường input: bắt buộc, tùy chọn (có thể để trống hoặc không), radio button, nút submit.

Bạn đang xem: Htmlspecialchars là gì

Htmlspecialchars($_server[php_self]) la gi

Những quy tắc đối với form trên:

TÊN TRƯỜNG QUY TẮC Tên Bắt buộc + Chỉ chứa các chữ cái và khoảng trắng E-mail Bắt buộc + Đúng địa chỉ email(chứa @ và .) Website Không bắt buộc. Nếu có, phải là một đường dẫn hợp lệ Bình luận Không bắt buộc. Được phép nhập nhiều dòng(textarea) Giới tính Bắt buộc. Chỉ được chọn một

Trước tiên, ta sẽ xem code HTML đơn giản cho form:

Text Field

Ten, email, website nhập vào phần tử dạng text, comment dạng textarea. Code của HTML sẽ như sau:

Tên: <input type=”text” name=”ten”><br> E-mail: <input type=”text” name=”email”><br> Website: <input type=”text” name=”website”><br> Bình luận: <textarea name=”binh_luan” rows=”5″ cols=”40″></textarea>

Ví dụ 1

Radio buttons

Trường gender thuộc radio button, code HTML sẽ như thế này:

Giới tính: <input type=”radio” name=”gioi_tinh” value=”female”>Nữ <input type=”radio” name=”gioi_tinh” value=”male”>Nam <input type=”radio” name=”gioi_tinh” value=”other”>Khác

Ví dụ 2

Phần Tử của Form

Code HTML sẽ như sau:

<form method=”post” action=”<?php echo htmlspecialchars($_SERVER[“PHP_SELF”]);?>”>

Khi form được submit, dữ liệu sẽ được gửi bằng phương thức POST.

$_SERVER[“PHP_SELF”] là gì?

$_SERVER[“PHP_SELF”] là một biến superglobal sẽ trả về tên file của tập lệnh đang được thực thi Vì vậy, $_SERVER[“PHP_SELF”] sẽ gửi dữ liệu đã được submit về tại ngay trang đó thay vì bị chuyển sang trang khác. Với cách này, người dùng sẽ sẽ thấy báo lỗi ở cùng trang với form.

Hàm htmlspecialchars() là gì?

Hàm htmlspecialchars() sẽ chuyển đổi các ký tự đặc biệt thành HTML entities. Điều đó có nghĩa là nó sẽ thay thế các ký tự như < và > thành &lt và &gt. Điều này ngăn chặn kẻ tấn công khai thác code bằng cách chèn mã HTML hoặc JavaScript.

Lưu Ý về Xử Lý Bảo Mật Form trong PHP**:

Đang hot: Titania Là Gì Trong Tiếng Việt? Titania Ý Nghĩa Của Tên

$_SERVER[“PHP_SELF”] có thể được sử dụng bởi các hacker!

Nếu PHP_SELF được sử dụng trên website của bạn, và một người dùng có thể sử dụng gạch chéo(/) và một số lệnh Cross Site Scripting(XSS) để thực hiện.

Chú ý: Cross Site Scripting(XSS) là một loại lỗ hổng bảo mật thường tìm thấy ở các ứng dụng web. XSS cho phép hackers chèn các đoạn mã từ máy chúng vào các trang web mà người dùng sử dụng.

Giả sử chúng ta có một form ở trang tên kiemTra_form.php:

<form method=”post” action=”<?php echo $_SERVER[“PHP_SELF”];?>”>

Bây giờ, khi người dùng nhập vào một URL bình thường vào trình duyệt, ví dụ như http://www.example.com/kiemTra_form.php, đoạn code phía trên sẽ được dịch thành:

<form method=”post” action=”kiemTra_form.php”>

Mọi chuyện vẫn ổn.

Tuy nhiên, nếu một người dùng khác nhập vào một URL như sau vào trình duyệt:

http://www.example.com/KiemTra_form.php/%22%3E%3Cscript%3Ealert(‘hacked’)%3C/script%3E

thì đoạn code trên sẽ dịch thành như sau:

<form method=”post” action=”kiemTra_form.php/”><script>alert(‘hacked’)</script>

Đoạn code này sẽ thêm vào một thẻ script và một lệnh cảnh báo. Khi load trang,đoạn mã Javascript sẽ được chạy(người dùng sẽ thấy hiện ô cảnh báo). Đây chỉ là một ví dụ đơn giản và vô hại mô tả cách mà PHP_SELF có thể bị khai thác.

Hãy cẩn trọng với bất kỳ đoạn mã Javascript có thể được thêm vào trong thẻ <script>!

Hacker có thể điều hướng người dùng sang một file trên server khác. File đó có thể chứa mã độc với các biến toàn cục bị sửa đổi hoặc submit form đến một trang khác để lấy dữ liệu người dùng.

Làm Thế Nào Để Tránh $_SERVER[“PHP_SELF”] Bị Khai Thác?

Để tránh $_SERVER[“PHP_SELF”] bị khai thác ta sử dụng hàm htmlspecialchars().

Code HTML có thể như sau:

<form method=”post” action=”<?php echo htmlspecialchars($_SERVER[“PHP_SELF”]);?>”>

Đang hot: Skincare là gì? Hướng dẫn quy trình skincare cơ bản đến chuyên sâu

Hàm htmlspecialchars() chuyển đổi các ký tự đặc biệt thành HTML entites. Nếu một người cố ý khai thác PHP_SELF thì kết quả sẽ như sau:

<form method=”post” action=”test_form.php/&quot;&gt;&lt;script&gt;alert(‘hacked’)&lt;/script&gt;”>

Khai thác bị thất bại, không có thiệt hại nào xảy ra!

Validate Form Data Trong PHP

Điều đầu tiên ta phải làm là chuyển đổi tất cả các biến thông qua hàm htmlspecialchars(). Khi sử dụng hàm htmlspecialchars(), khi người dùng cố ý submit một text field:

<script>location.href(‘http://www.hacked.com’)</script>

Đoạn code trên sẽ không thi hành được vì nó đã được bảo vệ bởi code HTML escaped, và kết quả sẽ trả về như sau:

&lt;script&gt;location.href(‘http://www.hacked.com’)&lt;/script&gt;

Code bây giờ sẽ an toàn để hiển thị trên trang web hoặc bên trong email.

Chúng ta cũng phải thực hiện thêm 2 việc khi người dùng nhập dữ liệu vào form:

  1. Loại bỏ các ký tự không cần thiết(khoảng trắng 2 đầu,tab, dòng mới) từ dữ liệu nhập vào(sử dụng hàm trim() trong PHP).
  2. Loại bỏ các dấu gạch chéo() từ dữ liệu nhập vào(sử dụng hàm stripslashes() trong PHP).

Bước tiếp theo là tạo một hàm sẽ thực hiện việc kiểm tra dữ liệu nhập vào(thuận tiện hơn là viết các dòng code kiểm tra lặp đi lặp lại.

Chúng ta sẽ đặt tên hàm này là kiemTra_input().

Bây giờ, chúng ta có thể kiểm tra mỗi $_POST với hàm kiemTra_input(). Đoạn code có thể như sau:

Ví dụ:

<?php // định nghĩa các biến và gán các giá trị rỗng $ten = $email = $gioi_tinh = $binh_luan = $website = “”; if ($_SERVER[“REQUEST_METHOD”] == “POST”) { $ten = kiemTra_input($_POST[“ten”]); $email = kiemTra_input($_POST[“email”]); $website = kiemTra_input($_POST[“website”]); $binh_luan = kiemTra_input($_POST[“binh_luan”]); $gioi_tinh = kiemTra_input($_POST[“gioi_tinh”]); } function kiemTra_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>

Ví dụ 3

Chú ý rằng khi bắt đầu, ta cần kiểm tra phương thức gửi dữ liệu bằng cách sử dụng $_SERVER[“REQUEST_METHOD”]. Nếu REQUEST_METHOD là POST, sau đó tiến hành việc gửi dữ liệu – nếu như nó hợp lệ. Nếu dữ liệu không được gửi đi, bỏ qua việc xác thực và hiển thị form trống.

Tuy nhiên, trong ví dụ trên, tất cả các input đều tùy chọn. Các dòng lệnh vẫn hoạt động tốt kể cả khi người dùng không gửi bất kỳ dữ liệu nào.

Bước tiếp theo là tạo những trường input bắt buộc và tạo tin nhắn báo lỗi nếu cần.

Tham khảo: Nhân viên lương cao (Highly Compensated Employee – HCE) là ai? Đặc điểm