PHP - Sanitize Input

Trong PHP, điều quan trọng là đảm bảo rằng dữ liệu đầu vào được làm sạch đúng cách bằng cách loại bỏ bất kỳ ký tự không mong muốn nào trước khi nó được xử lý bởi mã phía máy chủ. Thông thường, người dùng nhập dữ liệu của họ vào một ứng dụng web PHP thông qua một biểu mẫu HTML. Nếu dữ liệu biểu mẫu chứa bất kỳ ký tự không mong muốn nào, nó có thể gây hại, do đó, một thao tác làm sạch phù hợp phải được thực hiện.

Việc làm sạch đầu vào có thể được thực hiện với sự trợ giúp của một hoặc nhiều hàm sau đây trong PHP.

The htmlspecialchars() Function

Hàm này chuyển đổi các ký tự đặc biệt thành thực thể HTML.

htmlspecialchars(
   string $string,
   int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
   ?string $encoding = null,
   bool $double_encode = true
): string

Trong HTML, một số ký tự có ý nghĩa đặc biệt. Hàm htmlspecialchars() được sử dụng để mã hóa các ký tự đặc biệt thành các thực thể HTML. Điều này rất hữu ích khi bạn muốn hiển thị đầu vào của người dùng dưới dạng HTML và muốn ngăn chặn các cuộc tấn công chèn mã.

Các special characters sau đây được dịch như sau −

Character Replaced by
& (ampersand) &
" (double quote) ", unless ENT_NOQUOTES is set
' (single quote) ' (for ENT_HTML401 ) or ' (for ENT_XML1, ENT_XHTML or ENT_HTML5 ), but only when ENT_QUOTES is set
< (less than) &lt;
> (greater than) &gt;

Flag Constants

Tham số flags là một bitmask của một hoặc nhiều cờ sau đây, chỉ định cách xử lý dấu ngoặc kép, các chuỗi đơn vị mã không hợp lệ và loại tài liệu được sử dụng.

Sr.No Constant & Description
1 ENT_COMPAT Will convert double-quotes and leave single-quotes alone.
2 ENT_QUOTES Will convert both double and single quotes.
3 ENT_NOQUOTES Will leave both double and single quotes unconverted.
4 ENT_IGNORE discard invalid code unit sequences instead of returning an empty string.
5 ENT_SUBSTITUTE Replace invalid code unit sequences with a Unicode Replacement Character U+FFFD (UTF-8) or &#xFFFD;
6 ENT_DISALLOWED Replace invalid code points for the given document type with a Unicode Replacement Character U+FFFD (UTF-8) or &#xFFFD; (otherwise) instead of leaving them as is. This may be useful.
7 ENT_HTML401 Handle code as HTML 4.01.
8 ENT_XML1 Handle code as XML 1.
9 ENT_XHTML Handle code as XHTML.
10 ENT_HTML5 Handle code as HTML 5.

Example

Hãy xem xét ví dụ sau −

<?php
   $str = 'Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>';
   echo htmlspecialchars($str);
?>

Nó sẽ tạo ra output

Welcome To "PHP Tutorial" by <b>TutorialsPoint</b>

The strip_tags() Function

Hàm strip_tags() loại bỏ tất cả các thẻ HTML và PHP khỏi một chuỗi đã cho.

strip_tags(string $string, array|string|null $allowed_tags = null): string

Hàm này rất hữu ích khi bạn muốn đảm bảo rằng dữ liệu đầu vào của người dùng không chứa bất kỳ thẻ nào có thể gây hại.

Tham số allowed_tags là một tham số tùy chọn thứ hai để chỉ định các thẻ không nên bị loại bỏ. Các thẻ này có thể được cung cấp dưới dạng chuỗi hoặc dưới dạng mảng.

Example

Hãy xem xét ví dụ sau −

<?php
   $text = '<p>Hello World</p><!-- Comment --> 
      <a href="/test.html">Click Here</a>';
   echo strip_tags($text);
   echo "\n";

   // Allow <p> and <a>
   echo strip_tags($text, '<p><a>');
?>

Nó sẽ tạo ra output

Hello World 
      Click Here
Hello World

 
      Click Here

The addslashes() Function

Hàm addslashes() thêm dấu gạch chéo ngược vào một chuỗi.

addslashes(string $string): string

Hàm này trả về một chuỗi với các dấu gạch chéo ngược được thêm vào trước các ký tự cần được thoát. Các ký tự này là −

  • Dấu nháy đơn (')

  • Double Quote (")

  • Dấu gạch chéo ngược (\)

  • NUL (Byte NUL)

Sử dụng hàm này khi bạn đang lưu trữ dữ liệu đầu vào của người dùng trong cơ sở dữ liệu và muốn ngăn chặn các cuộc tấn công SQL injection.

Example

Hãy xem xét ví dụ sau −

<?php
   $text = "Newton's Laws";
   $str = addslashes($text);  

   // prints the escaped string 
   echo($str);  
?>

Nó sẽ tạo ra output

Newton\'s Laws

The filter_var() Function

Với sự trợ giúp của một cờ bộ lọc cụ thể, bạn có thể sử dụng hàm filter_var() để làm sạch dữ liệu đầu vào của người dùng.

filter_var(mixed $value, int $filter = 
   FILTER_DEFAULT, array|int $options = 0): mixed

Tham số $value là một biến có giá trị cần được làm sạch. Tham số $filter là bất kỳ hằng số bộ lọc nào được định nghĩa trước.

Sr.No ID & Description
1 FILTER_SANITIZE_EMAIL Remove all characters except letters, digits and !#$%&'*+-=?^_`{|}~@.[].
2 FILTER_SANITIZE_ENCODED URL-encode string, optionally strip or encode special characters.
3 FILTER_SANITIZE_ADD_SLASHES Apply addslashes(). (Available as of PHP 7.3.0).
4 FILTER_SANITIZE_NUMBER_FLOAT Remove all characters except digits, +- and optionally .,eE.
5 FILTER_SANITIZE_NUMBER_INT Remove all characters except digits, plus and minus sign.
6 FILTER_SANITIZE_SPECIAL_CHARS HTML-encode '"<>& and characters with ASCII value less than 32, optionally strip or encode other
special characters.
7 FILTER_SANITIZE_FULL_SPECIAL_CHARS Equivalent to calling htmlspecialchars() with ENT_QUOTES set. Encoding quotes can be disabled by setting FILTER_FLAG_NO_ ENCODE_QUOTES .
8 FILTER_SANITIZE_URL Remove all characters except letters, digits and $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
9 FILTER_UNSAFE_RAW

Example

Đoạn mã dưới đây cho thấy cách bạn có thể làm sạch dữ liệu Email −

<?php
   $a = 'abc def@xyz.com';

   $sa = filter_var($a, FILTER_SANITIZE_EMAIL);
   echo "$sa";
?>

Nó sẽ tạo ra output

abcdef@xyz.com

Example

Đoạn mã sau đây cho thấy cách bạn có thể làm sạch URL −

<?php
   $a = "http://example.c o m";

   $sa = filter_var($a, FILTER_SANITIZE_URL);
   echo "$sa";
?>

Nó sẽ tạo ra output

http://example.com