6 cũng không còn hỗ trợ - xèng

/imgposts/o4z7pryh.jpg

Hiện tại, tôi đang bảo trì một hệ thống ecshop. Do sử dụng PHP 5.2 và ý lich thi dau ngoai hang anh hom nay thức về bảo mật trong mã nguồn cũ rất yếu nên có nhiều lỗ hổng tiêm SQL (rất nhiều trường hợp nối chuỗi truy vấn SQL). Tôi bắt đầu học PHP thông qua tài liệu chính thức của Laravel, chưa bao giờ viết truy vấn SQL nguyên bản, vì vậy tôi hoàn toàn không biết cách phòng tránh tiêm SQL.

Trước tiên, hãy xem tài liệu chính thức của PHP:

mysql_query — Gửi một truy vấn MySQL Phần mở rộng này đã bị loại bỏ kể từ PHP 5.5.0, và đã bị xóa hoàn toàn trong PHP 7.0.0. Thay vào đó, phần mở rộng MySQLi hoặc PDO_MySQL nên được sử dụng. Xem thêm hướng dẫn chọn API MySQL và FAQ liên quan cho thêm thông tin. Các lựa chọn thay thế cho hàm này bao gồm: mysqli_query() PDO::query()

Thì ra mysql_query đã bị loại bỏ hoàn toàn trong PHP 7, thậm chí PHP 5.6 cũng không còn hỗ trợ. Tuy nhiên, trước khi nâng cấp ecshop để hỗ trợ PHP 7, chúng ta vẫn cần hiểu cách phòng tránh tiêm SQL trong PHP 5.2.

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
      mysql_real_escape_string($user),
      mysql_real_escape_string($password));

sprintf - Trả về một chuỗi được tạo theo định dạng format. Đồng thời sử dụng mysql_real_escape_string để thoát các dấu nháy đơn.

mysql_real_escape_string() không thoát các ký tự % và _. Đây là các ký tự đại diện trong MySQL nếu kết hợp với LIKE, GRANT, hoặc REVOKE. Sử dụng mysql_real_escape_string không thể thoát ký tự %, do đó khi sử dụng toán tử LIKE vẫn còn nguy cơ an ninh. Cách làm đúng là:

$search = mysql_real_escape_string($search);
$search = addcslashes($search, "%_");

Giải thích hàm:

string addcslashes ( string $str , string $charlist ) - Trả về một chuỗi với tu vi 12 con giap dấu gạch chéo ngược trước các ký tự được liệt kê trong tham số charlist.

Tôi đã đóng gói hai trường hợp trên thành một hàm:

function sql_escape($param, $is_like_param = false) {
  $param = mysql_real_escape_string($param);
  if ($is_like_param) {
    $param = addcslashes($param, "%_");
  }
  return $param;
}
  • Hướng dẫn sử dụng PDO i9bet
  • So sánh PHP-MySQL, PHP-MySQLi và PDO