2012-04-09 3 views
6

저는 장고 앱에서 프로그래밍 방식으로 MySQL 사용자를 생성해야하는 프로젝트에서 작업하고 있습니다. 사용자를 잘 만들 수 있습니다.MySQL-Python이 데이터베이스 이름 매개 변수 주위에 따옴표를 삽입하지 못하도록 방지합니다.

from django.db import connection, transaction 
cursor = connection.cursor() 
cursor.execute("CREATE USER %[email protected]'%'", 'username') 
cursor.execute("SET PASSWORD FOR %[email protected]'%' = PASSWORD(%s)", ('username', 'pass')) 

완벽하게 작동합니다. 문제는 사용 권한을 부여하려고 할 때입니다. 데이터베이스 이름은 프로그래밍 방식으로 결정됩니다

는 문자열 대체를하면, 그것은 구문 적으로 잘못된 데이터베이스 이름, 주위에 작은 따옴표를 배치하기 때문에 이것은 MySQL의 오류가 발생
cursor.execute("GRANT SELECT ON %s.* TO %[email protected]'%'", ('dbname', 'username')) 

:

DatabaseError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dbname'.* to 'username'@'%'' at line 1")

데이터베이스 이름에 대해 %s 주위에 작은 따옴표를 추가하지 않으려면 어떻게해야합니까? 파이썬에서 단순히 문자열 대체를 수행하고이를 수정할 수는 있지만 SQL 주입 취약점이 발생할 수 있음을 알고 있습니다.

+1

가능하지 않을 수도 있습니다. mysql-python docs : _Parameter 자리 표시 자에 따르면 열 값을 삽입하는 데만 사용할 수 있습니다. 테이블 이름, 문장 등과 같은 SQL의 다른 부분에는 사용할 수 없습니다. – dgel

답변

6

경우에 따라 자리 표시자가 작동하지 않는 경우가 있으므로 문자열 연결을 사용해야합니다. 주의하십시오. 문자열의 유효성을 검사하고 예상 한 문자로만 구성되었는지 확인하십시오 (예상하지 못한 문자를 찾지 마라). 그러면 괜찮습니다. 또한 다른 개발자에게 코드를 확인하게하고 아무도 그 자리 표시자를 사용해야한다고 생각하지 않도록 주석을 달아주십시오.

+0

좋은 조언. 감사. – dgel

관련 문제