your programing

MySQL에 연결하고 쿼리를 실행하는 데 가장 안전한 Python 모범 사례

lovepro 2021. 1. 5. 19:46
반응형

MySQL에 연결하고 쿼리를 실행하는 데 가장 안전한 Python 모범 사례


mysql에서 쿼리를 실행하는 가장 안전한 방법은 무엇입니까? MySQL 및 SQL 주입과 관련된 위험을 알고 있습니다.

그러나 다른 사용자 (웹 클라이언트)가 조작 할 수있는 변수에 대한 주입을 방지하기 위해 쿼리를 어떻게 실행해야하는지 모르겠습니다. 나는 내 자신의 이스케이프 함수를 작성하곤했지만 이것은 분명히 "완료되지 않은"것입니다.

무엇을 사용해야하며 어떻게 사용하여 mysql 주입 위험없이 Python을 통해 MySQL 데이터베이스에 안전하게 쿼리하고 삽입을 수행해야합니까?


주입을 피하려면 각 변수 대신 executewith %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)

저는 항상 데이터베이스 커넥터의 이스케이프 기능을 사용하는 것을 선호합니다. 의도 한대로 작동하며 이스케이프 기능을 수동으로 코딩하는 것은 보안 위험입니다.

참조 URL : https://stackoverflow.com/questions/7929364/python-best-practice-and-securest-to-connect-to-mysql-and-execute-queries

반응형