SQL injection protection
장고의 queryset(ORM)을 사용할 경우, SQL injection을 막아준다. 하지만 raw queries를 사용하는 extra(), RawSQL를 사용하거나 실제로 connection을 통해 직접적인 쿼리를 통해 사용할 경우에는 SQL injection 처리를 따로 해줘야 한다.
Python SQL injection
http://bobby-tables.com/python.html 에서 Python SQL injection 방법에 대해 설명하고 있다.
Bad:
cmd = "update people set name='%s' where id='%s'" % (name, id)
curs.execute(cmd)
Good:
cmd = "update people set name=%s where id=%s"
curs.execute(cmd, (name, id))
Bad의 경우에 id 키 값에 'hyuna' and 1=1 라고 보낼 경우 injection에 걸린다. 하지만, Good의 경우에 똑같이 'hyuna' and 1=1을 보내면 파라미터 자체를 스트링으로 치환해서 사용하기 때문에 injection에 걸리지 않는다.
mark 종류
e.g. '...WHERE name=%(name)s'
>>> import MySQLdb; print MySQLdb.paramstyle
format >>> import psycopg2; print psycopg2.paramstyle pyformat >>> import sqlite3; print sqlite3.paramstyle qmark위의 사이트에서는 MySQL이나 PostgreSQL을 사용할 때는 %s를 사용하면 되고 SQLite는 ?를 사용하면 된다고 한다.
Named Arguments
some_dictionary_with_the_data = {
'name': 'awesome song',
'artist': 'some band',
etc...
}
cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)
'Python' 카테고리의 다른 글
[Python] Private PYPI (0) | 2016.11.09 |
---|---|
[Python3] two list for loop (0) | 2016.11.08 |
[Python] 파이썬 정규식 (0) | 2016.10.27 |
[Python] call by assignment (call by object, call by object reference) (0) | 2016.10.26 |
[Python] RabbitMQ Publish Subscribe (0) | 2016.10.26 |
댓글