Giảm thiểu tấn công SQL Injection bằng cách sử dụng các câu lệnh đã chuẩn bị trước (Truy vấn được tham số hóa) – tuyên bố chuẩn bị tiêm sql

Cổng thông tin Khoa học Máy tính dành cho những người yêu thích máy tính. Nó bao gồm các bài báo về khoa học máy tính và lập trình được viết tốt, được tư duy tốt và được giải thích tốt, các câu đố và thực hành / lập trình cạnh tranh / các câu hỏi phỏng vấn công ty.

Bạn đang xem : câu lệnh chuẩn bị sẵn sql injection

Như đã giải thích trong bài viết này, một cuộc tấn công SQL Injection hoặc SQLi, là một cách khai thác lỗ hổng cơ bản của một câu lệnh SQL bằng cách chèn các câu lệnh SQL bất chính vào trường nhập của nó để thực thi. Nó xuất hiện lần đầu tiên vào năm 1998 và kể từ đó, nó chủ yếu nhắm vào các nhà bán lẻ và tài khoản ngân hàng. Khi kết hợp với các hình thức tấn công khác như tấn công DDOS, tập lệnh chéo trang web (XSS) hoặc chiếm quyền điều khiển DNS, nó có thể dẫn đến kết quả trên quy mô lớn.
Thuật ngữ:

  • Xác thực: Xác thực là quá trình kiểm tra xem đầu vào có đáp ứng một bộ tiêu chí không (chẳng hạn như một chuỗi không chứa dấu ngoặc kép độc lập).
  • Vệ sinh: Vệ sinh là quá trình sửa đổi đầu vào để đảm bảo rằng đầu vào hợp lệ (chẳng hạn như nhân đôi các dấu ngoặc kép).

Để tránh bị chèn SQL, tất cả đầu vào được nối trong SQL động phải được lọc và khử trùng chính xác.
Sơ lược về một cuộc tấn công SQL:
Một cuộc tấn công SQL có hai phần sau:

  • Nghiên cứu: Xem các phần dễ bị tấn công của ứng dụng cuối người dùng kết nối với cơ sở dữ liệu.
  • Tấn công: Nhập các trường độc hại có thể biến truy vấn thành lợi thế của riêng bạn.

No_WAF

Ví dụ 1:
Hãy xem xét đoạn mã sau cho một biểu mẫu xác thực < / strong> được viết bằng Java:

Java

< / p>

Truy vấn chuỗi = "CHỌN Tên người dùng, số dư TỪ tài khoản"

< / code> "userID" ) +

" và password = '" + request.getParameter ( "Mật khẩu" < / p>

thử

{

Câu lệnh câu lệnh = connect.createStatement ();

ResultSet rs = statement.executeQuery (truy vấn);

while (rs.next ())

{

page.addTableRow (rs.getString ( " userName " ),

rs.getFloat ( "balance" ));

}

}

bắt (SQLException e)

{} < / code>

 
  

Trong điều kiện bình thường, người dùng nhập userID của mình và passwor d và điều này tạo ra câu lệnh sau để thực thi:

 CHỌN userName, số dư
TỪ tài khoản
WHERE userID = 512 và password = 'thisisyoda' 

Một cuộc tấn công chèn SQL có thể xảy ra sẽ khai thác trường mật khẩu để tạo ra một biểu thức boolean, điều này sẽ làm cho biểu thức được đánh giá là đúng cho mọi trường hợp. Hãy tưởng tượng đặt trường userID và mật khẩu là

 userID = 1 'hoặc' 1 '=' 1
password = 1 'or' 1 '=' 1 

Sau đó câu lệnh SQL trở thành

 SELECT userName, balance
TỪ tài khoản
WHERE userID = '1' OR '1' = '1' và
      password = '1' OR '1' = '1' 

Truy vấn sẽ trả về một giá trị vì điều kiện (OR 1 = 1) luôn đúng. Bằng cách này, hệ thống đã xác thực người dùng mà không cần biết tên người dùng và mật khẩu.
Lỗ hổng bảo mật có thể được giảm thiểu bằng cách sử dụng một câu lệnh đã soạn sẵn để tạo một truy vấn được tham số hóa như sau:

Java

Truy vấn chuỗi = "CHỌN userName, số dư " +

"TỪ tài khoản WHERE userID =?

và mật khẩu =?";

thử {

Câu lệnh PreparedStatement = kết nối .prepareStatement (truy vấn);

statement.setInt ( 1 , request.getParameter ( "userID" < code class = "trơn">));

ResultSet rs = statement.executeQuery ();

trong khi (rs.next ())

{

page.addTableRow (rs.getString ( "userName" ),

rs.getFloat ( "balance" ));

}

} catch (SQLException e )

{...}

 
 

Nếu kẻ tấn công cố gắng cung cấp một giá trị cho trường userID không phải là một số nguyên đơn giản, thì statement.setInt () sẽ gây ra lỗi SQLException thay vì cho phép truy vấn hoàn tất.
Ví dụ2 >:
Xem xét anot kiểu tấn công của cô ấy trong quá trình xác thực:

Java

< / p>

Truy vấn chuỗi = "CHỌN userID, userName, passwordHash" +

" TỪ người dùng WHERE userName = '"

+ request.getParameter ( " user " < code class = "trơn">) + "'" ;

int userID = - 1 ;

HashMap userGroups = new HashMap ();

thử

{

Câu lệnh Statement = connect.createStatement ();

ResultSet rs = statement.executeQuery (truy vấn);

rs.first ();

userID = rs.getInt ( "userID" );

< / code>

if (! hashOf (request.getParameter ( " password " )). equals (rs.getString ( "passwordHash" )))

{

ném BadLoginException ();

}

< p class = "line number17 index16 alt2">

Chuỗi userGroupQuery = < / code> "CHỌN nhóm TỪ groupMembership" +

< code class = "undefined space"> "WHERE userID =" + userID;

rs = statement.executeQuery (userGroupQuery);

while (rs.next ())

{

userGroup.put (rs.getString ( "group" ), true );

}

}

catch (SQLException e) {}

catch (BadLoginException e ) {}

 
 

Một truy vấn thông thường sẽ như sau.

 CHỌN userID, userName, passwordHash
TỪ người dùng
WHERE userName = 'Anannya' 

Kẻ tấn công có thể đưa nội dung sau vào trường userName.

 Anannya ';
CHÈN VÀO nhóm Thành viên (userID, nhóm)
GIÁ TRỊ (CHỌN userID TỪ người dùng
WHERE userName = 'Anannya', 'Quản trị viên'); - 

Do đó, truy vấn thực tế sẽ thay đổi thành:

 CHỌN userID, userName, passwordHash FROM
       người dùng WHERE userName = 'Anannya';
CHÈN VÀO nhóm Thành viên (userID, nhóm)
GIÁ TRỊ (CHỌN userID TỪ người dùng
WHERE userName = 'Anannya', 'Quản trị viên'); - '

Điều này sẽ khiến một câu lệnh SQL khác được nối vào câu lệnh thực, khiến người dùng được thêm vào cơ sở dữ liệu Quản trị viên. Cuộc tấn công có thể được giảm thiểu bằng cách sử dụng một câu lệnh đã chuẩn bị sẵn với một truy vấn được tham số hóa như sau.

Java

Truy vấn chuỗi = " CHỌN userID, userName, passwordHash " +

"TỪ người dùng WHERE userName =?" < code class = "trơn">;

thử

{

Câu lệnh PreparedStatement =

connect.prepareStatement (userLoginQuery);

statement.setString ( 1 , request.getParameter ( "người dùng" ));

ResultSet rs = statement.executeQuery ();

}

 
 

Ví dụ3 :
Hãy xem xét một ví dụ khác về lỗ hổng truy vấn được thảo luận bên dưới:

Java

< / p>

Truy vấn chuỗi = " CHÈN VÀO GIÁ TRỊ của người dùng (" +

request.getParameter ( " userName "< / code>

 
  

Một truy vấn chung sẽ là:

 CHÈN GIÁ TRỊ VÀO người dùng ("Anannya") 

Hãy xem xét nếu kẻ tấn công nhập truy vấn sau vào trường userName:

 "Anannya); Người dùng DROP TABLE; "< > Truy vấn này sẽ xóa hoàn toàn bảng người dùng khi thực thi nó. Một giải pháp khác ở đây là một câu lệnh đã chuẩn bị sẵn. 
Việc sử dụng Câu lệnh chuẩn bị trong Java sẽ giúp ích như thế nào?
Một câu lệnh chuẩn bị câu lệnh “sanitizes” đầu vào. Điều này có nghĩa là nó đảm bảo rằng bất kỳ thứ gì người dùng nhập vào đều được coi là chuỗi ký tự trong SQL và KHÔNG phải là một phần của truy vấn SQL. Nó cũng có thể thoát các ký tự nhất định và phát hiện / xóa mã độc hại. Trong các ngôn ngữ như PHP, filter_input hoặc filter_input_array có thể được sử dụng để khử trùng chuỗi.
Bài viết này do Anannya Uberoi đóng góp. Nếu bạn thích GeeksforGeeks và muốn đóng góp, bạn cũng có thể viết bài viết bằng cách sử dụng write.geeksforgeeks.org hoặc gửi bài viết của bạn qua thư đến review-team@geeksforgeeks.org. Xem bài viết của bạn xuất hiện trên trang chính của GeeksforGeeks và trợ giúp khác Geeks.
Vui lòng viết nhận xét nếu bạn thấy bất kỳ điều gì không chính xác hoặc bạn muốn chia sẻ thêm thông tin về chủ đề đã thảo luận ở trên.

Ghi chú cá nhân của tôi


Xem thêm những thông tin liên quan đến chủ đề tuyên bố chuẩn bị tiêm sql

SQL Injection for database value change

alt

  • Tác giả: Loi Liang Yang
  • Ngày đăng: 2021-07-09
  • Đánh giá: 4 ⭐ ( 3522 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Want to learn all about cyber-security and become an ethical hacker? Join this channel now to gain access into exclusive ethical hacking videos by clicking this link: https://www.youtube.com/channel/UC1szFCBUWXY3ESff8dJjjzw/join

    Ethical Hacker | Penetration Tester | Cybersecurity Consultant

    About The Trainer:
    Loi Liang Yang
    Certified Information Systems Security Professional
    Certified Ethical Hacker
    CompTIA Security+

    Social networks:
    http://www.loiliangyang.com
    http://www.facebook.com/Loiliangyang/
    http://www.instagram.com/loiliangyang/
    http://www.linkedin.com/in/loiliangyang/

    Disclaimer: Hacking without permission is illegal. This channel is strictly educational for learning about cyber-security in the areas of ethical hacking and penetration testing so that we can protect ourselves against the real hackers.

Câu lệnh SQL được chuẩn bị sẵn trong db2/odbc (ngăn chặn việc đưa vào)

  • Tác giả: vncodeblog.com
  • Đánh giá: 3 ⭐ ( 3085 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Các tuyên bố chuẩn bị PDO có đủ để ngăn chặn SQL tiêm không?

  • Tác giả: qastack.vn
  • Đánh giá: 3 ⭐ ( 9169 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Câu trả lời ngắn gọn là KHÔNG , PDO chuẩn bị sẽ không bảo vệ bạn…

Các lỗ hổng SQL Injection và Cách Ngăn chặn Chúng

  • Tác giả: helpex.vn
  • Đánh giá: 5 ⭐ ( 2551 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bài học lịch sử tiêm SQL ngắn gọn Trong những ngày đầu của Internet, việc xây dựng các trang web rất đơn giản: không có JavaScript, không có CSS ​​và ít hình ảnh. Nhưng khi web trở nên phổ…

php — Các tuyên bố chuẩn bị PDO có đủ để ngăn chặn SQL tiêm không?

  • Tác giả: www.it-mot-dan-vi.com
  • Đánh giá: 3 ⭐ ( 7908 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hãy nói rằng tôi có mã như thế này:$dbh = new PDO("blahblah"); $stmt = $dbh->prepare('SELECT * FROM users where username = :username'); $stmt->execute( array(':username' => $_REQUEST['username']) ); Tài liệu PDO nói: Các tham...

Truy vấn được tham số hóa trong SQL

  • Tác giả: vi.tutorialcup.com
  • Đánh giá: 4 ⭐ ( 9645 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Truy vấn được tham số hóa trong SQL

Sự khác biệt giữa Tuyên bố JDBC và PreparedStatement (Công nghệ)

  • Tác giả: vi.sawakinome.com
  • Đánh giá: 5 ⭐ ( 5603 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trước khi chúng ta chuyển sang sự khác biệt, hãy hiểu JDBC là gì đầu tiên. JDBC (Kết nối cơ sở dữ liệu Java) là một API Java để kết nối và thực hiện các truy vấn với

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  JavaScript: Chuyển đổi chuỗi Hex sang Int64 (tương tự như Int64.parse) - chuỗi hex javascript thành int