Mysqli_real_escape_string php is_string là gì

Hàm is_string() trong PHP là hàm kiểm tra biến một biến có thuộc kiểu chuỗi hay không, nếu có là chuỗi hàm trả về giá trị TRUE, nếu không là chuỗi hàm trả về giá trị FALSE. Hàm này được sử dụng trên PHP4, PHP5 và PHP7.

Cú pháp hàm is_string trong PHP

is_string( $val );

Trong đó:

$var là biến cần kiểm tra.

Hàm is_string có tham số truyền vào là một biến và hàm sẽ xác định giá trị biến truyền vào có phải là kiểu chuỗi (string) hay không. Nếu biến là chuỗi hàm trả về giá trị TRUE, ngược lại nếu biến là không là chuỗi hàm trả về giá trị FALSE.

Ví dụ hàm is_string trong PHP:

Đây là ví dụ đơn giản để bạn có thể hiểu được cách thức hoạt động của hàm is_string()

Đây là ví dụ mình tham khảo trên trang php.net.

echo "is_string("; var_export($value); echo ") = "; echo var_dump(is_string($value)); } ?>

Và đây là kết quả sau khi chạy đoạn code trên:

is_string(false) = bool(false) is_string(true) = bool(false) is_string(NULL) = bool(false) is_string('abcd') = bool(true) is_string('23') = bool(true) is_string(23) = bool(false) is_string('23.5') = bool(true) is_string(23.5) = bool(false) is_string('') = bool(true) is_string(' ') = bool(true) is_string('0') = bool(true) is_string(0) = bool(false)

Trong PHP còn có một số hàm như is_numeric() kiểm tra biến truyền vào có thuộc kiểu số hay chuỗi không và is_integer() kiểm tra một biến truyền vào có phải là một số nguyên hay không, bạn có thể tham khảo thêm bài viết của mình.

Hi vọng với bài viết này, bạn đã hiểu rõ ứng dụng của hàm is_string trong PHP. Nếu thấy bài viết hay và ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé.

Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection

Description

Object-oriented style

public mysqli::real_escape_string(string $string): string

mysqli_real_escape_string(mysqli $mysql, string $string): string

Caution

Security: the default character set

The character set must be set either at the server level, or with the API function mysqli_set_charset() for it to affectmysqli_real_escape_string(). See the concepts section on character sets for more information.

Parameters

mysql

Procedural style only: A mysqli object returned by mysqli_connect() or mysqli_init()

string

The string to be escaped.

Characters encoded are NUL (ASCII 0),\n, \r, `,$string`0, `$string`1, and CTRL+Z.

Dễ dàng nhận thấy đoạn code trên đang ẩn chứa nguy cơ bị tấn công SQL injection do không có cơ chế ngăn chặn nào với các giá trị người dùng nhập hoặc câu truy vấn.

1.1. Cơ bản

  • Sử dụng hàm

    $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']);

    3

Hàm

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

3 sẽ chuyển các ký tự đặc biệt trong chuỗi thành các ký tự hợp lệ để truy vấn cơ sở dữ liệu. Ví dụ với input

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

5 sau khi sử dụng hàm trên sẽ trở thành

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

6. Cài đặt như sau:

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

  • Sử dụng hàm

    $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']);

    7

Hàm

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

7 sẽ chuyển các ký tự đặc biệt như

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

9,

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

0,

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

1,

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

2,

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

3, và

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

4 thành các ký tự HTML. Cài đặt như sau:

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

1.2. Trung bình

  • Sử dụng hàm

    $username = htmlspecialchars($_POST['username']); $password = htmlspecialchars($_POST['password']);

    5

Hàm

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

5 thêm dấu gạch chéo

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

7 trước các ký tự đặc biệt như dấu nháy đơn

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

3, dấu nháy kép

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

2, dấu chấm phẩy

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

0 và dấu gạch chéo

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

7 trong chuỗi. Ví dụ khi người dùng nhập giá trị cho biến

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

2 là

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

3 sau khi sử dụng hàm trên sẽ trở thành

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

4. Câu truy vấn khi đó:

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

5 trở nên an toàn. Cài đặt như sau:

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

  • Sử dụng

Hàm

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

6 là một hàm trong PHP dùng để ngăn chặn lỗ hổng SQL injection. Nó sẽ chuyển các ký tự đặc biệt trong chuỗi như

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

3,

$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);

2,

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

0, ... thành các ký tự hợp lệ để truy vấn cơ sở dữ liệu. Cài đặt như sau:

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

1.3. Nâng cao

  • Sử dụng PDO prepared statements

PDO prepared statements sử dụng các câu lệnh SQL được thực thi trước đó để tránh các lỗ hổng bảo mật như SQL injection. Đồng thời nó cũng giúp tối ưu hóa các truy vấn và tăng tốc độ truy vấn.

Cách sử dụng PDO prepared statements:

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

  • Sử dụng các hàm

    $username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']);

    0,

    $username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']);

    1,

    $username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']);

    2

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

0 dùng để liên kết các tham số đầu vào với câu lệnh SQL đã được biên dịch. Nó được sử dụng để tránh các lỗi bảo mật và để tránh việc phải thực hiện các chuỗi để truy vấn cơ sở dữ liệu.

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

1 dùng để thực thi một câu lệnh SQL đã được biên dịch trước bởi hàm

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

5. Nó trả về TRUE nếu câu lệnh được thực thi thành công và FALSE nếu thất bại.

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

2 dùng để lấy dữ liệu từ một kết quả truy vấn đã được thực thi bằng câu lệnh truy vấn đã được biên dịch. Hàm này trả về một mảng các giá trị của các cột trong kết quả truy vấn.

Cách cài đặt như sau:

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
/* Set our params */
$name = "Viblo";
$email = "[email protected]";
/* Execute the prepared Statement */
$stmt->execute();
/* Fetch the result */
$result = $stmt->get_result();
$row = $result->fetch_assoc();
/* Close the statement */
$stmt->close();

2. Framework Rail

  • Sử dụng các Rails built-in sanitization methods.

Framework Rails tích hợp các built-in sanitization methods giúp ngăn chặn các cuộc tấn công SQL Injection. Những method này có sẵn thông qua class ActiveRecord::Base và có thể được sử dụng để "làm sạch" dữ liệu người dùng trước khi được sử dụng trong câu truy vấn. Bao gồm:

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

7,

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

8,

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

9,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

0,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

1. Cài đặt ví dụ:

sql = "SELECT * FROM users WHERE name = ?"
params = ["Viblo"]
sanitized_sql = ActiveRecord::Base.sanitize_sql([sql, params])
# sanitized_sql = "SELECT * FROM users WHERE name = 'Viblo'"

  • Sử dụng các Rails built-in escaping methods

Rails built-in escaping methods ngăn chặn tấn công SQL injection bao gồm:

  1. Active Record's attribute methods:
  2. ActiveRecord::Base # attribute
  3. ActiveRecord::Base # attributes
  4. ActiveRecord::Base # attribute_names
  5. ActiveRecord::Base # attribute_present
  6. Active Record's sanitize methods:
  7. ActiveRecord::Base # sanitize_sql
  8. ActiveRecord::Base # sanitize_sql_array
  9. ActiveRecord::Base # sanitize_sql_for_assignment
  10. Active Record's quoting methods:
  11. ActiveRecord::Base # quote
  12. ActiveRecord::Base # quote_value
  13. ActiveRecord::Base # quoted_table_name
  14. ActiveRecord::Base # quoted_primary_key
  15. Active Record's type casting methods:
  16. ActiveRecord::Base # type_cast_attribute_for_write
  17. ActiveRecord::Base # type_cast_attribute_for_read
  18. ActiveRecord::Base # type_cast_attribute
  19. Active Record's quoting methods:
  20. ActiveRecord::Base # quote_column_name
  21. ActiveRecord::Base # quote_table_name
  22. ActiveRecord::Base # quote_default_expression
  23. Active Record's escaping methods:
  24. ActiveRecord::Base # connection.quote
  25. ActiveRecord::Base # connection.quote_string
  26. ActiveRecord::Base # connection.quote_column_name
  27. ActiveRecord::Base # connection.quote_table_name

Một ví dụ sử dụng method

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

2 chỉnh sửa một mảng các chuỗi và lọc bỏ bất kỳ ký tự đặc biệt nào có thể được sử dụng để chèn mã SQL độc hại:

sanitize_sql_array(["SELECT * FROM users WHERE name = ?", params[:name]])

Dòng code trên sẽ escape bất kỳ ký tự đặc biệt nào trong tham số

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

3 trước khi nó được sử dụng trong truy vấn SQL.

3. Sử dụng tường lửa

Chúng ta cũng có thể sử dụng tường lửa (firewall) thực hiện ngăn chặn tấn công SQL injection. Ở đây tôi sẽ lấy ví dụ với firewall mod_security. Một ví dụ đơn giản cho rule ngăn chặn tấn công như sau:

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

0

Rule trên sẽ kiểm tra các request tới

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

4, thực hiện block các request khả nghi chứa các keywords hoặc patterns thường được sử dụng trong các kịch bản tấn công SQL injection như

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

5,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

6,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

7,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

8,

// Tạo một đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=myDatabase', $user, $pass);
// Tạo câu lệnh SQL cần thực thi:
$sql = "SELECT * FROM users WHERE username = :username";
//Tạo một đối tượng PDOStatement:
$stmt = $db->prepare($sql);
// Gán giá trị cho các tham số trong câu lệnh SQL:
$stmt->bindParam(':username', $username);
// Thực thi câu lệnh:
$stmt->execute();
// Lấy kết quả trả về:
$result = $stmt->fetchAll();

9. Đồng thời cũng block các request chứa các ký tự đặc biệt như

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
/* Set our params */
$name = "Viblo";
$email = "[email protected]";
/* Execute the prepared Statement */
$stmt->execute();
/* Fetch the result */
$result = $stmt->get_result();
$row = $result->fetch_assoc();
/* Close the statement */
$stmt->close();

0,

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
/* Set our params */
$name = "Viblo";
$email = "[email protected]";
/* Execute the prepared Statement */
$stmt->execute();
/* Fetch the result */
$result = $stmt->get_result();
$row = $result->fetch_assoc();
/* Close the statement */
$stmt->close();

1, ... Tuy nhiên, việc config tường lửa cần thận trọng do có thể xảy ra tình trạng false positive (block "nhầm" các request bình thường từ user). Chẳng hạn với rule như trên cũng có thể block một số request từ người dùng khi họ sử dụng các dấu ngoặc

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
/* Set our params */
$name = "Viblo";
$email = "[email protected]";
/* Execute the prepared Statement */
$stmt->execute();
/* Fetch the result */
$result = $stmt->get_result();
$row = $result->fetch_assoc();
/* Close the statement */
$stmt->close();

2,

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
/* Set our params */
$name = "Viblo";
$email = "[email protected]";
/* Execute the prepared Statement */
$stmt->execute();
/* Fetch the result */
$result = $stmt->get_result();
$row = $result->fetch_assoc();
/* Close the statement */
$stmt->close();

3.

Để tránh xảy ra tình trạng false positive, chúng ta có thể thêm một số rule kiểm tra các yếu tố có thể giúp chúng ta xác định request đó là một request an toàn.

Chẳng hạn có thể kiểm tra độ dài request do các request có kích thước lớn thường là dấu hiệu cho thấy ẩn chứa nguy cơ khai thác lỗ hổng SQL injection. Ví dụ kiểm tra request và chỉ cho phép các request có độ dài nhỏ hơn hoặc bằng 100100:

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

1

Hoặc có thể thêm rule kiểm tra header HTTP Referer và chỉ block các request có header Referer bất thường. Ví dụ:

Mysql_real_escape_string () là gì?

Ví dụ ở trong PHP, bạn có thể dùng hàm mysql_real_escape_string() để loại bỏ những kí tự có thể gây ảnh hưởng đến câu lệnh SQL.