복붙노트

[PYTHON] 파이썬 모범 사례와 securest를 사용하여 MySQL에 연결하고 쿼리 실행

PYTHON

파이썬 모범 사례와 securest를 사용하여 MySQL에 연결하고 쿼리 실행

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

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

무엇을 사용해야하며 어떻게 mysql 주입을 위험에 빠뜨리지 않으면 서 파이썬을 통해 MySQL 데이터베이스에 쿼리하고 안전하게 삽입해야합니까?

해결법

  1. ==============================

    1.주입을 피하려면 각 변수 대신 % s를 사용하여 실행 한 다음 실행의 두 번째 매개 변수로 목록 또는 튜플을 통해 값을 전달하십시오. 다음은 문서의 예제입니다.

    주입을 피하려면 각 변수 대신 % s를 사용하여 실행 한 다음 실행의 두 번째 매개 변수로 목록 또는 튜플을 통해 값을 전달하십시오. 다음은 문서의 예제입니다.

    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') 주위에 따옴표가 필요하지 않습니다.

  2. ==============================

    2.Bruno의 답변을 확장 한 MySQL 클라이언트 라이브러리는 명명 된 매개 변수를 지정하는 여러 가지 형식 중 하나를 지원할 수 있습니다. PEP 249 (DB-API)에서 다음과 같이 쿼리를 작성할 수 있습니다.

    Bruno의 답변을 확장 한 MySQL 클라이언트 라이브러리는 명명 된 매개 변수를 지정하는 여러 가지 형식 중 하나를 지원할 수 있습니다. PEP 249 (DB-API)에서 다음과 같이 쿼리를 작성할 수 있습니다.

    >>> 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,))
    
    >>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})
    

    paramstyle 모듈 수준의 변수를 보면 클라이언트 라이브러리가 지원하는 것을 볼 수 있습니다 :

    >>> clientlibrary.paramstyle
    'pyformat'
    

    위의 옵션 중 하나라도 불안전 한 데이터를 처리하는 것과 관련하여 올바른 작업을 수행해야합니다. 브루노 (Bruno)가 지적했듯이, 매개 변수를 직접 삽입하지 마십시오. 일반적으로 사용되는 클라이언트 라이브러리는 단순한 필사자보다 더 정확하게 데이터를 처리 할 때 훨씬 좋습니다.

  3. ==============================

    3.mysqldb를 사용하고 있다면 내장 된 escape_string 함수를 사용할 수있다. 이렇게

    mysqldb를 사용하고 있다면 내장 된 escape_string 함수를 사용할 수있다. 이렇게

    sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
    cursor.execute(sql)
    

    필자는 항상 데이터베이스 커넥터의 이스케이프 기능을 사용하는 것을 선호합니다. 이스케이프 기능을 직접 코딩하고 수동으로 코딩하면 보안 위험이 있습니다.

  4. from https://stackoverflow.com/questions/7929364/python-best-practice-and-securest-to-connect-to-mysql-and-execute-queries by cc-by-sa and MIT license