>  기사  >  백엔드 개발  >  django에서 SQL 주입을 피하는 방법

django에서 SQL 주입을 피하는 방법

(*-*)浩
(*-*)浩원래의
2019-05-09 09:54:435654검색

Django에서 SQL 삽입을 방지하는 방법: 1. 사용자 입력을 확인합니다. 2. SQL의 동적 어셈블리를 사용하지 않습니다. 3. 기밀 정보를 직접 저장하지 않습니다. 4. 응용 프로그램 예외 정보는 가능한 한 적게 제공해야 합니다. . SQL 주입을 효과적으로 방지하려면 Dajngo의 ORM을 사용하세요.

django에서 SQL 주입을 피하는 방법

SQL 주입이란 무엇인가요?

소위 SQL 주입이란 웹 양식 제출에 SQL 명령을 삽입하거나 도메인 이름이나 페이지 요청에 대한 쿼리 문자열을 입력하여 궁극적으로 서버를 속여 악성 SQL 명령을 실행하도록 하는 것입니다. 구체적으로는 기존 애플리케이션을 이용해 백엔드 데이터베이스 엔진에 (악의적인) SQL 명령을 주입해 실행하는 기능이다. 오히려 웹 폼에 (악의적인) SQL 문을 입력해 보안 취약점이 있는 웹사이트의 정보를 얻을 수 있다. 디자이너가 의도한 대로 SQL 문을 실행하는 것보다 예를 들어, 이전의 많은 영화 및 TV 웹사이트에서는 주로 웹 양식을 통해 쿼리 문자를 제출하여 VIP 회원 비밀번호를 유출했습니다. 이러한 양식은 특히 SQL 삽입 공격에 취약합니다.

예를 들어, 현재 데이터베이스에 front_user 테이블이 있습니다. 테이블 구조는 다음과 같습니다.

class User(models.Model): telephone = models.CharField(max_length=11) username = models.CharField(max_length=100)
 password = models.CharField(max_length=100)

그런 다음 기본 SQL 문을 사용하여 다음 요구 사항을 달성합니다.

1. 사용자 ID를 기반으로 합니다. 샘플 코드는 다음과 같습니다.

def index(request): user_id = request.GET.get('user_id') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where id=%s' % user_id) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

표면적으로는 문제가 없어 보입니다. 하지만 사용자가 전달한 user_id가 1 또는 1=1인 경우 위의 스플라이스된 ​​sql 문은 다음과 같습니다.

select id,username from front_user where id=1 or 1=1

위 sql 문의 조건은 id=1 또는 1=1입니다. =1 또는 1=1 둘 중 하나가 성립하면 전체 조건이 성립됩니다. 1=1

이 확실히 확립되어 있다는 것은 의심의 여지가 없습니다. 따라서 위의 SQL 문을 실행하면 front_user 테이블의 모든 데이터가 추출됩니다.

2. 사용자 이름을 기준으로 사용자를 추출하는 뷰를 구현합니다. 샘플 코드는 다음과 같습니다.

def index(request): username = request.GET.get('username') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where username='%s'' % username) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

표면적으로는 문제가 없어 보입니다. 하지만 사용자가 전달한 사용자 이름이 zhiliao' 또는 '1=1인 경우 위의 스플라이싱된 ​​sql 문은 다음과 같습니다.

select id,username from front_user where username='zhiliao' or '1=1'

위 sql 문의 조건은 사용자 이름='zhiliao' 또는 문자열이 없습니다. 문자열이 의심 스럽다는 판단이 확실히 확립되었습니다. 따라서 front_user 테이블의 모든 데이터가 추출됩니다.

SQL 주입 방어는 다음과 같은 점으로 구분할 수 있습니다.

이상은 SQL 주입의 원리입니다. 그는 자신의 목표를 달성하기 위해 일부 악의적인 매개변수를 전달하여 원본 SQL 문을 파괴합니다. 물론 SQL 주입은 결코 단순하지 않으며 지금 우리가 말하는 것은 빙산의 일각에 불과합니다. 그렇다면 SQL 주입을 방지하는 방법은 무엇입니까?

1. 사용자 입력을 절대 신뢰하지 마세요. 사용자의 입력을 확인하려면 정규식을 사용하거나 작은따옴표와 큰따옴표 등을 변환하여 길이를 제한할 수 있습니다.

2. SQL의 동적 어셈블리를 사용하지 마세요. 매개변수화된 SQL을 사용하거나 데이터 쿼리 및 액세스에 저장 프로시저를 직접 사용할 수 있습니다. 예:

def index(request): user_id = '1 or 1=1' cursor = connection.cursor() cursor.execute('select id,username from 
front_user where id=%s',(user_id,)) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')

3. 관리자 권한으로 데이터베이스 연결을 사용하지 마십시오. 각 애플리케이션에 대해 제한된 권한을 가진 별도의 데이터베이스 연결을 사용하십시오.

4. 기밀 정보를 직접 저장하지 말고 비밀번호와 민감한 정보를 암호화하거나 해시하지 마세요.

5. 애플리케이션의 예외 정보는 가능한 한 적은 힌트를 제공해야 합니다. 사용자 정의 오류 정보를 사용하여 원래 오류 정보를 래핑하는 것이 가장 좋습니다.

요약:

1. 웹 페이지에서 삽입 공격을 수행하려면 SQL 문을 사용하세요. 웹 페이지는 사용자 입력 매개 변수를 얻지만 일부 악의적인 사용자는 백엔드가 매개 변수를 판단하지 않고 매개 변수를 가져오는 경우 특수 SQL 문을 사용합니다. 정확성과 적법성, 데이터베이스에 해를 끼칠 수 있습니다

2. get 및 post로 데이터를 업로드할 때 매개변수를 확인하세요

3. Dajngo의 ORM을 사용하면 Django에서 특수 문자를 이스케이프 처리했기 때문에 SQL 삽입을 효과적으로 피할 수 있습니다.

위 내용은 django에서 SQL 주입을 피하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.