Hướng dẫn mysqli real escape string bypass - bỏ qua chuỗi thoát thực mysqli

TL;DR

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
3 sẽ không cung cấp bảo vệ nào (và hơn nữa có thể sử dụng dữ liệu của bạn) nếu:provide no protection whatsoever (and could furthermore munge your data) if:

  • Chế độ SQL

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4 của MySQL được bật (có thể, trừ khi bạn chọn một chế độ SQL khác một cách rõ ràng mỗi khi bạn kết nối); và

  • Chuỗi SQL của bạn theo nghĩa đen của bạn được trích dẫn bằng cách sử dụng các ký tự

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    5 quote.

Đây đã được nộp dưới dạng lỗi #72458 và đã được sửa trong MySQL v5.7.6 (xem phần đứng đầu "The Saving Grace", bên dưới).The Saving Grace", below).

Đây là một trường hợp khác, (có lẽ ít hơn?)

Để tôn kính câu trả lời tuyệt vời của @ircmaxell (thực sự, điều này được cho là tâng bốc và không đạo văn!), Tôi sẽ áp dụng định dạng của anh ấy:

Cuộc tấn công

Bắt đầu với một cuộc biểu tình ...

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"'); // could already be set
$var = mysql_real_escape_string('" OR 1=1 -- ');
mysql_query('SELECT * FROM test WHERE name = "'.$var.'" LIMIT 1');

Điều này sẽ trả về tất cả các hồ sơ từ bảng

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
6. Một sự mổ xẻ:

  1. Chọn chế độ SQL

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    

    Như đã được ghi lại theo chuỗi chữ:

    Có một số cách để bao gồm các ký tự trích dẫn trong một chuỗi:

    • Một ____ ____ ____17 bên trong một chuỗi được trích dẫn với ____ ____17 có thể được viết là ____ ____19.

    • Một ____ ____ ____15 bên trong một chuỗi được trích dẫn với ____ ____15 có thể được viết dưới dạng ____ ____22.

    • Trước ký tự trích dẫn bởi một ký tự thoát (Hồi ____ ____23).

    • Một ____ ____17, bên trong một chuỗi được trích dẫn với ____ ____15 không cần điều trị đặc biệt và không cần phải nhân đôi hoặc thoát khỏi. Theo cách tương tự, ____ ____15, bên trong một chuỗi được trích dẫn với ____ ____17, không cần điều trị đặc biệt.

    Nếu chế độ SQL của máy chủ bao gồm

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4, thì phần ba trong số các tùy chọn này, đó là cách tiếp cận thông thường được áp dụng bởi ____ 13 không có sẵn: một trong hai tùy chọn đầu tiên phải được sử dụng thay thế. Lưu ý rằng ảnh hưởng của viên đạn thứ tư là người ta nhất thiết phải biết nhân vật sẽ được sử dụng để trích dẫn theo nghĩa đen để tránh dữ liệu của một người.

  2. Tải trọng

    " OR 1=1 -- 
    

    Tải trọng bắt đầu tiêm này hoàn toàn theo nghĩa đen với ký tự

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    5. Không có mã hóa cụ thể. Không có ký tự đặc biệt. Không có byte kỳ lạ.

  3. mysql_real_escape_string()

    $var = mysql_real_escape_string('" OR 1=1 -- ');
    

    May mắn thay,

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3 không kiểm tra chế độ SQL và điều chỉnh hành vi của nó cho phù hợp. Xem
    $var = mysql_real_escape_string('" OR 1=1 -- ');
    
    2:

    ulong STDCALL
    mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
                 ulong length)
    {
      if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
        return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
      return escape_string_for_mysql(mysql->charset, to, 0, from, length);
    }
    

    Do đó, một hàm cơ bản khác,

    $var = mysql_real_escape_string('" OR 1=1 -- ');
    
    3, được gọi nếu chế độ
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4 SQL được sử dụng. Như đã đề cập ở trên, một chức năng như vậy cần phải biết nhân vật nào sẽ được sử dụng để trích dẫn theo nghĩa đen để lặp lại nó mà không làm cho ký tự trích dẫn khác được lặp lại theo nghĩa đen.

    Tuy nhiên, chức năng này tùy ý giả định rằng chuỗi sẽ được trích dẫn bằng ký tự

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    7 đơn. Xem
    $var = mysql_real_escape_string('" OR 1=1 -- ');
    
    6:

    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    

    Vì vậy, nó để lại các ký tự

    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    5 không bị ảnh hưởng (và nhân đôi tất cả các ký tự
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    7) không phân biệt nhân vật thực tế được sử dụng để trích dẫn theo nghĩa đen! Trong trường hợp của chúng tôi
    $var = mysql_real_escape_string('" OR 1=1 -- ');
    
    9 vẫn giống hệt như đối số được cung cấp cho ____ 13 13, nó như thể không có sự trốn thoát nào xảy ra.

  4. Truy vấn

    mysql_query('SELECT * FROM test WHERE name = "'.$var.'" LIMIT 1');
    

    Một cái gì đó của một hình thức, truy vấn được kết xuất là:

    SELECT * FROM test WHERE name = "" OR 1=1 -- " LIMIT 1
    

Như người bạn đã học của tôi đã đặt nó: Xin chúc mừng, bạn đã tấn công thành công một chương trình bằng cách sử dụng ____ 13 ...

Những người xấu

ulong STDCALL
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
             ulong length)
{
  if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
    return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
  return escape_string_for_mysql(mysql->charset, to, 0, from, length);
}
2 không thể giúp đỡ, vì điều này không liên quan gì đến các bộ ký tự;
ulong STDCALL
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
             ulong length)
{
  if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
    return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
  return escape_string_for_mysql(mysql->charset, to, 0, from, length);
}
3 cũng không thể, vì đó chỉ là một trình bao bọc khác xung quanh cùng chức năng này.

Vấn đề, nếu chưa rõ ràng, đó là lời kêu gọi

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
3 không thể biết nhân vật nào theo nghĩa đen sẽ được trích dẫn, vì điều đó còn lại cho nhà phát triển để quyết định sau đó. Vì vậy, trong chế độ
mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4, thực sự không có cách nào mà chức năng này có thể thoát khỏi mọi đầu vào một cách an toàn để sử dụng với trích dẫn tùy ý (ít nhất, không phải không nhân đôi các ký tự không yêu cầu nhân đôi và do đó thu thập dữ liệu của bạn).cannot know with which character the literal will be quoted, as that's left to the developer to decide at a later time. So, in
mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4 mode, there is literally no way that this function can safely escape every input for use with arbitrary quoting (at least, not without doubling characters that do not require doubling and thus munging your data).

Xấu xí

Nó trở nên tồi tệ hơn.

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4 có thể không phải là tất cả những điều không phổ biến trong tự nhiên do sự cần thiết của việc sử dụng nó để tương thích với SQL tiêu chuẩn (ví dụ: xem Phần 5.3 của đặc tả SQL-92, cụ thể là sản xuất ngữ pháp
ulong STDCALL
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
             ulong length)
{
  if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
    return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
  return escape_string_for_mysql(mysql->charset, to, 0, from, length);
}
7 và thiếu bất kỳ ý nghĩa đặc biệt nào được đưa ra cho BackSlash). Hơn nữa, việc sử dụng nó được khuyến nghị rõ ràng như là một cách giải quyết cho lỗi (từ lâu đã cố định) mà bài đăng của IRCMaxell mô tả. Ai biết được, một số DBA thậm chí có thể định cấu hình nó theo mặc định là phương tiện không khuyến khích sử dụng các phương pháp thoát không chính xác như
ulong STDCALL
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
             ulong length)
{
  if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
    return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
  return escape_string_for_mysql(mysql->charset, to, 0, from, length);
}
8.

Ngoài ra, chế độ SQL của kết nối mới được máy chủ đặt theo cấu hình của nó (mà người dùng

ulong STDCALL
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
             ulong length)
{
  if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
    return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
  return escape_string_for_mysql(mysql->charset, to, 0, from, length);
}
9 có thể thay đổi bất cứ lúc nào); Do đó, để chắc chắn về hành vi của máy chủ, bạn phải luôn chỉ định rõ ràng chế độ mong muốn sau khi kết nối.

Ân sủng cứu rỗi

Miễn là bạn luôn đặt chế độ SQL một cách rõ ràng để không bao gồm

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4 hoặc trích dẫn các chữ cái MySQL bằng cách sử dụng ký tự một đoạn, lỗi này không thể nuôi lặp lại sẽ đúng.

Vì lý do này, tôi khuyên mọi người nên sử dụng

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4 cũng cho phép chế độ
/*
  Escape apostrophes by doubling them up

// [ deletia 839-845 ]

  DESCRIPTION
    This escapes the contents of a string by doubling up any apostrophes that
    it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
    effect on the server.

// [ deletia 852-858 ]
*/

size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                               char *to, size_t to_length,
                               const char *from, size_t length)
{
// [ deletia 865-892 ]

    if (*from == '\'')
    {
      if (to + 2 > to_end)
      {
        overflow= TRUE;
        break;
      }
      *to++= '\'';
      *to++= '\'';
    }
3, vì nó sẽ buộc sử dụng theo thói quen các chuỗi chữ được trích xuất đơn. Lưu ý rằng điều này không ngăn được tiêm SQL trong trường hợp các chữ được trích dẫn kép xảy ra được sử dụng, nó chỉ làm giảm khả năng xảy ra điều đó (vì các truy vấn không độc hại bình thường sẽ thất bại).

Trong PDO, cả chức năng tương đương của nó

/*
  Escape apostrophes by doubling them up

// [ deletia 839-845 ]

  DESCRIPTION
    This escapes the contents of a string by doubling up any apostrophes that
    it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
    effect on the server.

// [ deletia 852-858 ]
*/

size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                               char *to, size_t to_length,
                               const char *from, size_t length)
{
// [ deletia 865-892 ]

    if (*from == '\'')
    {
      if (to + 2 > to_end)
      {
        overflow= TRUE;
        break;
      }
      *to++= '\'';
      *to++= '\'';
    }
4 và trình giả lập câu lệnh đã chuẩn bị của nó khi ____ 55, điều này chính xác: nó đảm bảo rằng nghĩa đen thoát ra được trích dẫn trong các trích dẫn đơn, vì vậy bạn có thể chắc chắn rằng PDO luôn miễn dịch với lỗi này.

Kể từ MySQL v5.7.6, lỗi này đã được sửa. Xem Nhật ký thay đổi:

Chức năng được thêm hoặc thay đổi

  • Thay đổi không tương thích: Chức năng A API C mới,

    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    
    6, đã được triển khai để thay thế cho
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3 vì hàm sau có thể không mã hóa các ký tự khi chế độ
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4 SQL được bật. Trong trường hợp này,
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3 không thể thoát khỏi các ký tự trích dẫn ngoại trừ bằng cách nhân đôi chúng và để làm điều này đúng cách, nó phải biết nhiều thông tin về bối cảnh trích dẫn hơn là có sẵn.
    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    
    6 có một lập luận bổ sung để chỉ định bối cảnh trích dẫn. Để biết chi tiết sử dụng, hãy xem mysql_real_escape_string_quote ().
    A new C API function,
    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    
    6, has been implemented as a replacement for
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3 because the latter function can fail to properly encode characters when the
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4 SQL mode is enabled. In this case,
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3 cannot escape quote characters except by doubling them, and to do this properly, it must know more information about the quoting context than is available.
    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    
    6 takes an extra argument for specifying the quoting context. For usage details, see mysql_real_escape_string_quote().

     Note

    Các ứng dụng nên được sửa đổi để sử dụng

    /*
      Escape apostrophes by doubling them up
    
    // [ deletia 839-845 ]
    
      DESCRIPTION
        This escapes the contents of a string by doubling up any apostrophes that
        it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
        effect on the server.
    
    // [ deletia 852-858 ]
    */
    
    size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
                                   char *to, size_t to_length,
                                   const char *from, size_t length)
    {
    // [ deletia 865-892 ]
    
        if (*from == '\'')
        {
          if (to + 2 > to_end)
          {
            overflow= TRUE;
            break;
          }
          *to++= '\'';
          *to++= '\'';
        }
    
    6, thay vì
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    3, hiện không bị lỗi và tạo ra lỗi
    mysql_query('SELECT * FROM test WHERE name = "'.$var.'" LIMIT 1');
    
    3 nếu
    mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
    
    4 được bật.

    Tài liệu tham khảo: Xem thêm lỗi #19211994.

Ví dụ an toàn

Được thực hiện cùng với lỗi được giải thích bởi IRCMaxell, các ví dụ sau hoàn toàn an toàn (giả sử rằng một lỗi sử dụng MySQL muộn hơn 4.1.20, 5.0.22, 5.1.11; hoặc một người không sử dụng mã hóa kết nối GBK/BIG5) :

mysql_set_charset($charset);
mysql_query("SET SQL_MODE=''");
$var = mysql_real_escape_string('" OR 1=1 /*');
mysql_query('SELECT * FROM test WHERE name = "'.$var.'" LIMIT 1');

... Bởi vì chúng tôi đã chọn rõ ràng một chế độ SQL không bao gồm

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4.

mysql_set_charset($charset);
$var = mysql_real_escape_string("' OR 1=1 /*");
mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");

... Bởi vì chúng tôi đang trích dẫn chuỗi theo nghĩa đen của chúng tôi với các trích dẫn đơn.

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
0

... Bởi vì các câu lệnh được chuẩn bị PDO miễn nhiễm với lỗ hổng này (và IRCMaxell cũng vậy, với điều kiện là bạn đang sử dụng PHP≥5.3.6 và bộ ký tự đã được đặt chính xác trong DSN; hoặc mô phỏng câu lệnh đã chuẩn bị đã bị vô hiệu hóa) .

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
1

... Bởi vì chức năng

mysql_query('SELECT * FROM test WHERE name = "'.$var.'" LIMIT 1');
6 của PDO không chỉ thoát khỏi nghĩa đen, mà còn trích dẫn nó (trong các ký tự
mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
7 đơn lẻ); Lưu ý rằng để tránh lỗi của IRCMaxell trong trường hợp này, bạn phải sử dụng PHP≥5.3.6 và đã đặt chính xác ký tự được đặt trong DSN.

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
2

... Bởi vì các tuyên bố chuẩn bị MySQLI là an toàn.

Gói lên

Vì vậy, nếu bạn:

  • Sử dụng các câu lệnh chuẩn bị bản địa

HOẶC

  • Sử dụng MySQL v5.7.6 trở lên

HOẶC

  • Sử dụng MySQL v5.7.6 trở lên

    • PDO;
    • Ngoài việc sử dụng một trong các giải pháp trong bản tóm tắt của IRCMAXELL, hãy sử dụng ít nhất một trong số:
    • Chuỗi một chuỗi được trích xuất một chữ; hoặc

một chế độ SQL được đặt rõ ràng không bao gồm

mysql_query('SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
4

Chuỗi Escape thực của MySQLI làm gì?

Định nghĩa và sử dụng real_escape_string () / mysqli_real_escape_string () Hàm thoát khỏi các ký tự đặc biệt trong một chuỗi để sử dụng trong truy vấn SQL, có tính đến bộ ký tự hiện tại của kết nối.escapes special characters in a string for use in an SQL query, taking into account the current character set of the connection.

MySQL_REAL_ESCAPE_STRING có bị phản đối không?

Phần mở rộng này đã được không nhận được trong Php 5.5.0 và nó đã bị loại bỏ trong Php 7.0. 0, and it was removed in PHP 7.0.

Tôi có cần mysqli_real_escape_string không?

Graham gần đây đã hỏi tôi: Tôi vẫn cần sử dụng mysqli_real_escape_string khi được sử dụng các câu lệnh được chuẩn bị trong PHP?Câu trả lời đơn giản là không có.Cách nó được sử dụng để hoạt động là bạn sẽ lấy dữ liệu đầu vào hình thức, đưa nó vào một biến và đưa dữ liệu đó vào truy vấn MySQL của bạn để thêm dữ liệu đó vào cơ sở dữ liệu.The simple answer is no. The way it used to work is that you would take form input data, put that into a variable, and inject that data into your MySQL query in order to add that data to the database.

MySQLI_REAL_ESCAPE_STRING có an toàn không?

PHP cung cấp MySQL_REAL_ESCAPE_STRING () để thoát các ký tự đặc biệt trong một chuỗi trước khi gửi truy vấn đến MySQL.Chức năng này được nhiều người thông qua để thoát khỏi các trích dẫn đơn trong chuỗi và cùng một dịp ngăn chặn các cuộc tấn công tiêm SQL.Tuy nhiên, nó có thể tạo ra các lỗ hổng bảo mật nghiêm trọng khi nó không được sử dụng chính xác.it can create serious security flaws when it is not used correctly.