MySQL에 연결하고 쿼리를 실행하는 데 가장 안전한 Python 모범 사례
mysql에서 쿼리를 실행하는 가장 안전한 방법은 무엇입니까? MySQL 및 SQL 주입과 관련된 위험을 알고 있습니다.
그러나 다른 사용자 (웹 클라이언트)가 조작 할 수있는 변수에 대한 주입을 방지하기 위해 쿼리를 어떻게 실행해야하는지 모르겠습니다. 나는 내 자신의 이스케이프 함수를 작성하곤했지만 이것은 분명히 "완료되지 않은"것입니다.
무엇을 사용해야하며 어떻게 사용하여 mysql 주입 위험없이 Python을 통해 MySQL 데이터베이스에 안전하게 쿼리하고 삽입을 수행해야합니까?
주입을 피하려면 각 변수 대신 execute
with %s
를 사용한 다음 목록 또는 튜플을 통해 값을의 두 번째 매개 변수로 전달 execute
합니다. 다음은 문서 의 예입니다 .
c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
WHERE price < %s""", (max_price,))
이것은 %가 아닌 쉼표를 사용하고 있다는 점에 유의하십시오 (이스케이프되지 않고 직접 문자열 대체). 이러지 마세요 :
c.execute("""SELECT spam, eggs, sausage FROM breakfast
WHERE price < %s""" % (max_price,))
또한 '%s'
매개 변수가 문자열 인 경우 위치 표시 자 ( )를 따옴표로 묶을 필요가 없습니다 .
Bruno의 답변의 확장으로 MySQL 클라이언트 라이브러리는 명명 된 매개 변수를 지정하기 위해 여러 다른 형식을 지원할 수 있습니다. 에서 PEP 249 (DB-API) , 당신은 당신의 쿼리를 같이 쓸 수있다 :
'qmark'
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))
'숫자'
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :1", (lumberjack,))
'명명 된'
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :jack", {'jack': lumberjack})
'체재'
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %s", (lumberjack,))
'pyformat'
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})
paramstyle
모듈 수준 변수를 살펴보면 클라이언트 라이브러리가 지원하는 것을 확인할 수 있습니다 .
>>> clientlibrary.paramstyle
'pyformat'
위의 옵션은 안전하지 않을 수있는 데이터 처리와 관련하여 올바른 일을해야합니다. Bruno가 지적했듯이 매개 변수를 직접 삽입하지 마십시오. 일반적으로 사용되는 클라이언트 라이브러리는 단순한 인간보다 데이터를 올바르게 처리하는 데 훨씬 뛰어납니다.
mysqldb를 사용하는 경우 내장 된 escape_string 함수를 사용할 수 있습니다. 이렇게.
sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)
저는 항상 데이터베이스 커넥터의 이스케이프 기능을 사용하는 것을 선호합니다. 의도 한대로 작동하며 이스케이프 기능을 수동으로 코딩하는 것은 보안 위험입니다.
'your programing' 카테고리의 다른 글
특정 열의 값이 다른 열의 값보다 작은 경우 행만 선택 (0) | 2021.01.05 |
---|---|
Rails 3에서 최신 기록 찾기 (0) | 2021.01.05 |
Jasmine의 toHaveBeenCalledWith 메서드와 함께 객체 유형 사용 (0) | 2021.01.05 |
빌드 타임 스탬프를 APK에 쓰는 방법 (0) | 2020.12.31 |
나뭇 가지 함수에서 절대 경로를 사용하는 방법 (0) | 2020.12.31 |