0

これが以前に質問されていないことを願っています。使用するキーワードがわかりませんでした。

クエリに対して以下のステートメントを取ることができる関数を書きたいとします...

import MySQLdb

def query1(date,le):
  '''
  query1('2013-01',<= )
  >>> 10
  '''

  query = '''
  select * 
  from   table 
  where  number {x} 1
         and date = {dt}
  '''.format(dt=date,x=le)

  cursor.execute(query)
  rslt = cursor.fetchall()

  return rslt

次に、これを行う最良の方法は何ですか?

4

2 に答える 2

1

比較演算子を文字列として関数に渡すだけです。

query1('2013-01', '<=')

これにより、演算子の文字列がクエリに挿入され、次のようになります。

select * 
from   table 
where  number <= 1
     and date = 2013-01

文字列を挿入して SQL クエリを直接作成すると、SQL インジェクションの潜在的なベクトルになることに注意してください。ユーザーが独自の日付文字列を提供できるようにすると、ユーザーが SQL コードを挿入して悪意のあるコードを実行する可能性があります。詳細については、クエリのパラメーター化を参照してください。

SQL インジェクションを防ぎたい場合は、次のようにする必要があります。許可されたオペレーターのリストは慎重にホワイトリストに登録されているため、有効で安全なオペレーターのみを使用できます。これは、クエリの作成に使用されます。次に、cursor.execute()コマンドによって日付がクエリに挿入されます。MySQLdb次に、データから安全なクエリの構築を処理し、悪意のあるユーザーが日付文字列の代わりに独自の SQL を挿入することを許可しません。

import MySQLdb

def query1(date, comp):
    query = '''
    select * 
    from   table 
    where  number {comp} 1
           and date = %s
    '''.format(comp=sql_comp_operator(comp))

    cursor.execute(query, (date, ))
    return cursor.fetchall()

def sql_comp_operator(comp):
     operators = {
         'lt': '<',
         'lte': '<',
         'gt': '>',
         'gte': '>=',
     }
     if comp in operators:
         return operators[comp]
     else:
         raise ValueError("Unknown comparison operator '{}'".format(comp))

query1('2013-01', 'lte')
于 2013-04-15T02:11:25.043 に答える