Computer >> Máy Tính >  >> Kết nối mạng >> An ninh mạng

PHP SQL Injection:Tất cả những gì bạn cần biết

Trong lớp tấn công chèn, PHP SQL injection cuộc tấn công đã xuất hiện rất nổi bật. Phần lớn các trang web dễ bị tấn công. Theo nghiên cứu, hơn 50% các cuộc tấn công được thực hiện trên web bằng cách sử dụng SQL injection. Trong bài viết này, chúng ta sẽ thảo luận về cách thực hiện SQL injection và cách chúng ta có thể ngăn chặn điều tương tự trong các ứng dụng PHP.

SQL Injection (SQLi) là gì?

Trước tiên, chúng ta hãy hiểu SQL injection. Chèn SQL (SQLi) là một cách tiếp cận mà tin tặc thay đổi câu lệnh SQL đang chạy ở phần phụ trợ thông qua việc làm sai lệch các lệnh SQL đã thực thi. Hình thức tiêm như vậy được thực hiện thông qua các trường đầu vào của biểu mẫu và gây ra hậu quả khủng khiếp trên cơ sở dữ liệu. Cuối cùng nó dẫn đến việc tiết lộ thông tin nhạy cảm cao từ cơ sở dữ liệu. Khi tin tặc giành được quyền kiểm soát cơ sở dữ liệu thông qua việc đưa vào các lệnh SQL, anh ta / cô ta có quyền chèn, cập nhật hoặc thậm chí xóa dữ liệu khỏi cơ sở dữ liệu.

Tấn công SQL injection xảy ra khi mã không được viết theo kiểu bảo mật. Một số trong số chúng dường như được viết bằng mã hóa an toàn, nhưng vẫn nhường chỗ cho SQLi là:

  • Lọc không chính xác các ký tự khoảng trắng và xử lý kiểu
  • Truyền dữ liệu chưa được bảo vệ, được mã hóa không đúng cách vào cơ sở dữ liệu
  • Kết hợp mã và dữ liệu
  • Sử dụng dấu ngoặc kép để phân tách các chuỗi

Nói tóm lại, khi đầu vào của người dùng không được xác thực đúng cách, thì sẽ dẫn đến việc dữ liệu của người dùng bị cơ sở dữ liệu diễn giải một cách ác ý. Nếu dữ liệu đầu vào của người dùng được tải trực tiếp từ giao diện người dùng và được chèn vào truy vấn, thì điều đó cũng sẽ dẫn đến một thỏa hiệp.

Một vấn đề khác dẫn đến SQLi là các lỗi được hiển thị cho người dùng có thể bị người dùng độc hại lợi dụng để lấy thông tin chi tiết về loại và phiên bản cơ sở dữ liệu và do đó triển khai khai thác gây ra tấn công SQL injection.

PHP SQL Injection là gì?

Ví dụ về Mã không an toàn

Chúng ta hãy hiểu khái niệm về tấn công chèn SQL SQL với sự trợ giúp của mã PHP dễ bị tấn công sau:

<?php

$username = $_POST[‘uname'];

$pass = $_POST[‘password'];

$sql = "SELECT * FROM user_table WHERE username='".$username."' AND userpwd='".$pass"';";

?>

Đoạn mã trên chấp nhận đầu vào của người dùng trực tiếp mà không cần bất kỳ xác thực nào và chèn nó trực tiếp vào truy vấn SQL sẽ chạy trên cơ sở dữ liệu. Một hacker cũng có thể chèn vào nó các truy vấn logic sẽ trả về kết quả true, tức là nếu biến $ password nhận giá trị là ”hoặc‘ 1 ’=’ 1 ′ thì giá trị trở thành 1 =1 luôn đúng. Điều này cuối cùng sẽ dẫn đến đăng nhập thành công, dẫn đến xâm phạm bảo mật nghiêm trọng.

Ngoài ra, hãy xem xét một tình huống khác mà lỗi được hiển thị cho người dùng

<?php

elseif($mysqli->error)

{

print($mysqli->error);

}

?>

Trong trường hợp này, thay vì in nhật ký lỗi trên màn hình người dùng, cách tốt hơn là giữ một cơ sở dữ liệu nơi có thể đăng nhập nhật ký lỗi và sau đó được sử dụng để kiểm tra số lần trang web bị SQLi .

Ví dụ về Mã bảo mật

Ví dụ về mã hóa an toàn để tránh PHP SQL injection có thể xác thực tên người dùng và mật khẩu cho các truy vấn logic như vậy theo cách sau:

<?php

Function checkUserInput($str)

{

return

str_replace(array("‘",""", "'", ‘"‘),array("‘","&quot;"'","&quot;",$str));

}

$username = checkUserInput($_POST[‘uname']);

$pass = checkUserInput($_POST[‘password']);

?>

Theo cách này, đầu vào của người dùng có thể được xác thực trước khi được nối vào một truy vấn SQL. Một cách tiếp cận khác để ngăn chặn việc đưa PHP SQL vào là sử dụng các câu lệnh đã chuẩn bị sẵn (Đối tượng dữ liệu PHP (PDO)). Đây là một cách tiếp cận hiệu quả trong đó các câu lệnh SQL có thể được thực thi lặp đi lặp lại. PDO cung cấp các phương pháp làm cho các truy vấn được tham số hóa dễ sử dụng. Nó cũng nâng cao khả năng đọc và tính di động của mã và hoạt động với không chỉ cơ sở dữ liệu MySQL mà còn với các loại cơ sở dữ liệu khác. PDO xác định phần nào được coi là đầu vào của người dùng và phần còn lại là lệnh cơ sở dữ liệu.

Một đoạn mã ví dụ cho PDO cho cơ sở dữ liệu MySQL là:

//DB credentials

define(‘DB_HOST','localhost');

define(‘DB_USER','John_Reaper');

define(‘DB_PASS','[email protected]@$$w0rd$');

define(‘DB_NAME','users');

if(isset($_GET[‘id']))

{

$id = $_GET[‘id'];

if(is_numeric($id) == true)

{

try

{

$dbh = new PDO(‘DBHOST;DB_NAME','DB_USER','DB_PASS');

$dbh->setAttribute(PDO::AFTER_ERRMODE, PDO::ERRMODE_EXCEPTION);

$q = "SELECT username FROM users WHERE id = :id";

$sth = $dbh->prepare($q);

$sth->bindParam(‘:id',$id);

$sth->execute();

$sth->setFetchMode(PDO::FETCH_ASSOC);

$res = $sth->fetchColumn();

print(htmlentities($res));

$dbh = null;

}

catch(PDOException $e)

{

error_log(‘PDOException - ‘.$e->getMessage(),0);

http_response_code(500);

die(‘Connection to database unsuccessful');

}

}

else

{

http_response_code(400);

die(‘Error processing malformed request');

}

}

Cách ngăn việc đưa vào PHP SQL

Do đó, bạn có thể bảo mật trang web của mình khỏi SQL injection bằng cách triển khai các phương pháp hay nhất sau:

  1. Xác thực thông tin nhập của người dùng ở giao diện người dùng bằng JavaScript hoặc ở phần phụ trợ bằng PHP.
  2. Không hiển thị lỗi cho người dùng. Thay vào đó, ghi các lỗi vào một tệp và khiến kẻ tấn công không thể truy cập được. Ngoài ra, thông báo lỗi hiển thị cho người dùng phải rất chung chung và không tiết lộ bất kỳ thông tin nào về cơ sở dữ liệu.
  3. Sử dụng truy vấn được tham số chỉ định một phần của truy vấn SQL cần được coi là đầu vào của người dùng.
  4. Loại bỏ các thủ tục được lưu trữ không sử dụng vì chúng có thể dễ dàng khai thác và do đó ngăn chặn việc đưa vào SQL.
  5. Trao quyền thích hợp cho người dùng phù hợp để tránh bất kỳ sự xâm phạm nào trong trường hợp kẻ tấn công bỏ qua xác thực.

Bảo vệ tối ưu khỏi PHP SQL Injection

Sử dụng tường lửa như Astra có thể nâng cao khả năng miễn nhiễm của bạn với SQLi. Ngoài SQLi, Astra Security Suite còn bảo vệ một trang web khỏi hơn 100 cuộc tấn công khác, một số trong số đó là bot xấu, XSS, CSRF, v.v.

PHP SQL Injection:Tất cả những gì bạn cần biết

Trình quét phần mềm độc hại của chúng tôi được biết là quét một trang web trong vòng chưa đầy 10 phút. Và thậm chí mất ít thời gian hơn (<1 phút) cho các lần quét tiếp theo. Dưới sự cung cấp Kiểm tra bảo mật và Thử nghiệm năm lần của chúng tôi, các kỹ sư tại Astra quét từng dòng mã theo cách thủ công để tìm và sửa các lỗ hổng trong trang web của bạn nhằm đảm bảo tính bảo mật không thể xâm nhập.

PHP SQL Injection:Tất cả những gì bạn cần biết

Tham gia buổi giới thiệu Astra ngay hôm nay!