Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

SQL 인젝션이란? 어떻게 막을 수 있습니까?

<시간/>

SQL 인젝션은 웹 해킹 기술입니다. 데이터베이스에 악성 코드를 삽입하고 데이터베이스를 파괴하는 코드 주입 기술입니다. 웹페이지 입력을 통한 악성코드 삽입입니다.

SQL 인젝션의 주요 원인은 데이터베이스 내부의 데이터를 조작하는 SQL 쿼리에 데이터를 스마트하게 제공하는 것입니다.

학생 데이터가 있는 테이블이 있다고 가정합니다. 각 학생은 학생 ID를 사용하여 자신의 데이터를 볼 수 있습니다. SQL 쿼리는 학생의 학생 ID 입력을 받도록 설계되었습니다.

이제 학생은 학생 ID를 "12345 or 1=1"로 입력할 수 있습니다. 이것은 다음 쿼리로 변환됩니다.

SELECT * FROM Students WHERE id==12345 또는 1=1

이제 위의 쿼리는 1=1이 항상 참이기 때문에 다른 학생의 레코드도 반환합니다. 따라서 다른 학생들의 데이터는 안전하지 않으며 해커가 오용하기 쉽습니다.

MySQL 커넥터 모듈에는 SQL 주입을 방지하기 위해 쿼리 값을 이스케이프하는 메서드가 있습니다. 쿼리 값은 자리 표시자 %s을(를) 사용하여 이스케이프할 수 있습니다.

"MyTable"이라는 테이블이 있다고 가정합니다.

+----------+---------+----------+------------+ | 이름 | 수업 | 도시 | 표시 |+----------+---------+----------+------------+| 카란 | 4 | 암리차르 | 95 || 사힐 | 6 | 암리차르 | 93 || 크리티 | 3 | 바탈라 | 88 || 쿠시 | 9 | 델리 | 90 || 키라트 | 5 | 델리 | 85 |+----------+---------+-----------+------------+ 

예시

 import mysql.connectordb=mysql.connector.connect(host="your host", user="your username", password="yourpassword",database="database_name")cursor=db.cursor()query=" SELECT * FROM Students WHERE Name=%s"name=("Karan",)cursor.execute(query,name) for row in myresult:print(row)

위의 코드는 쿼리 값을 이스케이프하기 위해 자리 표시자를 사용하는 것을 보여줍니다.

출력

('카란', 4, '암리차르', 95)