2011-07-11 5 views
1

私は私の個人的なプロジェクトのためのMySQLデータベースと関連するアカウントの作成を自動化するのに役立つ小さなpythonスクリプトを書いています。このスクリプトの一部は、データベース名を文字列として取り、次にデータベースを作成する関数です。MySQLクエリでデータベース名をパラメータ化する安全な方法はありますか?

def createDB(dbConn, dbName): 
    import MySQLdb 
    c = dbConn.cursor() 
    query = """CREATE DATABASE %s;"""; 
    c.execute(query, (dbName,)) 

MySQL's CREATE DATABASE

CREATE DATAbASE test_db 

のように、データベースの引用符で囲まれていない名前を尋ねたが、安全問合せにユーザーに提供デシベル名を挿入しようとする私のコードが作成されますので、これは動作しません。

CREATE DATABASE 'test_db' 

あなたは「あなたのMySQL構文に近いテストで問題があります」というメッセージが表示されます。

これは個人的な使い方ではありますが、私は実際にユーザーが提供した文字列をあらゆる種類のクエリに直接挿入したくありません。それは私の宗教に対するものです。 test_db; DROP some_other_db;などのユーザー入力が拒否されるか、正しくエスケープされるようにするpython(または他の言語)のmySQLクエリにユーザー提供のデータベース名を挿入する安全な方法はありますか?

+0

ここで2番目の答えに従って 'conn.escape_string'を試してください:http://stackoverflow.com/questions/3617052/escape-string-python-for-mysql –

答えて

1

後:あなただけの、何かのようなPythonで置換を行うだろう、あなたはこれを必要と確信している場合は

は、あなたが入力のソースを信頼し、あなたは無効な文字の入力をチェックしていますphpmyadminがバッククォートを使ってデータベース名、表名、列名を引用することが判明しました。彼らは単に実行します。

入力文字列のいずれかのバッククォートはphpmyadminののコードに応じて交換することによって行われる、エスケープする必要がある。もちろん、

CREATE DATABASE `test_db; DROP some_other_db`; 

のようなもの上記のエラーケースに与える
$sql_query = 'CREATE DATABASE ' . PMA_backquote($new_db); 

をすべての単一のバックチック。ダブルバックチック。私はこれが正しいことを確認する場所を見つけることができません。

バックティックは標準SQLではありませんが、私はオンラインでも気づきました。

4

データベース名(または列またはテーブル名)はデータ値ではないため、プレースホルダを適切に使用することはできません。これをやりたければ、通常は悪い兆候です。 DBAのみがcreate databaseを発行する必要があります。そのためには、かなりの特権が必要です。ほとんどのアプリケーションでは、DBAが作成データベースを発行し、dbapi.Connectionの引数で使用するパラメータとして作成したデータベースを使用する必要があります。

def createDB(dbConn, dbName): 
    c = dbConn.cursor() 
    query = """CREATE DATABASE %s;""" % dbName 
    c.execute(query) 
+0

申し訳ありませんが非常に満足のいく答えです。 db adminだけがこれを行う必要があり、ツールなしで直接クエリを実行する必要がある場合、phpmyadminとその他の同様のツールはどのように機能しますか?ウェブフォームにデータベース名を入力してバックエンドでクエリを実行してデータベースを作成するにはどうすればよいですか?彼らは同じ問題を抱えているようで、ユーザーの入力を検証して安全にクエリに配置する必要があります。 –

+0

phpmyadminは、それが話しているDBAだとみなします。名前の中に「admin」があります。彼らは同様に、自分のロジックを実装して、渡されるdb名が正常であることを確認し、管理者は自分が何をしているかを知っています。 – SingleNegationElimination

+0

私のスクリプトは同じとみなします。私のスクリプトは、自分の開発ボックスで実行されているmysqlの管理者によって実行されています。私の開発者は、新しい楽しいパーソナルプロジェクトを開始するのに便利です。 –

関連する問題