2009-08-13 17 views
12

FlexでAIRでアプリケーションを開発していますが、SQLiteでどこが間違っているのか分かりません(MySQLに慣れています)。パラメータは機能しますが、特定の場合にのみ有効です。これは、SQLインジェクションに対する組み込み衛生システムの一部ですか?助けてくれてありがとう!SQLiteパラメータ - tablenameをパラメータとして使用できません

作品:

sqliteの

"INSERT:カテゴリからフィールド"、パラメータは次のとおりです。フィールド= "*"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

esn't仕事(でSQL構文エラー ":表"):

sqliteの

"INSERT:フィールドFROM:表":フィールド= "*" と:パラメータは、表= "カテゴリー"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

答えて

30

には、通常、SQLパラメータ/プレースホルダを使用できません。(テーブル、カラム、ビュー、スキーマなど)またはデータベース機能(例:CURRENT_DATE)の代わりに、リテラルをバインドする場合にのみ使用します。

パラメータ化された(別名準備された)ステートメントのサーバー側サポートでは、DBエンジンは一度クエリを解析し、バインドするパラメータ(型、最大長、精度など)の特徴を覚えておいてください既に解析されたクエリの後続の実行で使用されます。しかし、データベースオブジェクトのような重要なビットが不明な場合、クエリを構文要素に適切に解析することはできません。

したがって、ストアドプロシージャまたは適切に実行されるSQL文を動的に連結/補間/補完するクライアントコードで、テーブル名自体を置換する必要があります。いずれにしても、データベースAPIをの引用符で囲むためのSQL API機能を使用することを忘れないでください。

+1

あなたの最初の段落はそれをすべて言います。 – Lucky

-1

これは同じですが、私はJavaで似たような全体に走ったかどうかわかりません。あなたはそのようなステートメントを生成する必要がありますので、基本的には、パラメータとしてテーブルを追加することはできません。

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

これはsecurestソリューションほとんどそうではないので、あなたが追加する前に、データのいくつかのカスタム検証したい場合がありますテーブル名..だれかがテーブル名 "; drop tableName ..."を送信しようとしません。

関連する問題