2017-07-27 13 views
-2

このエラーはラインで行わSQLエラー:近い ":02":構文エラー

char* passwd, *imei, *mobile_num, *strtok_var ; 
cout<<idIndex << "+" << passwd<<"+"<<imei << "+" << mobile_num << endl; 

プリント 1 + ABC + ABC + ABC

テーブルで作成

sprintf(sql, "INSERT INTO Device_Details (imei, mobile_num, passwd, Dev_addr, id) " \ 
      "VALUES (%s, %d, %s, %s, %d); ", imei, id, passwd, dev_addr, id); 
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg); 

sql = "CREATE TABLE Device_Details(" \ 
      "imei CHAR(32) PRIMARY KEY  NOT NULL," \ 
      "mobile_num INT NOT NULL," \ 
      "passwd  CHAR(50) ," \ 
      "Dev_addr  CHAR(50) ," \ 
      "id   INT);"; 

     /* Execute SQL statement */ 
     rc = sqlite3_exec(db, sql, 0/*callback*/, 0, &zErrMsg); 
+5

'cout << ...'はCの代わりにC++タグが必要であることを暗示します。 –

+0

[クエリの準備](https://stackoverflow.com/questions/4820374/sqlite-escape-string-c)を参照してください。 。 – tadman

答えて

0

アドレッシングあなたの当面の問題は、あなたの文字列は引用符で囲まれていません。

sprintf(sql, "INSERT INTO Device_Details (imei, mobile_num, passwd, Dev_addr, id) " \ 
     "VALUES ('%s', %d, '%s', '%s', %d); ", imei, id, passwd, dev_addr, id); 

しかし、私は非常にこのようなSQL文の手動作成に対して推薦します。そうするとSQL injection攻撃が公開されます。

例えば、誰かがpasswdために次の文字列を使用したとします

', '', 1); drop table Device_Details; -- 

結果のSQLは次のようなものになります。

INSERT INTO Device_Details (imei, mobile_num, passwd, Dev_addr, id) 
VALUES ('+', 1, '', '', 1); drop table Device_Details; --', 'dev_addr', 1); 

これは、元のINSERT文をクローズすることは、DELETE TABLEステートメントを追加します元の残りの部分をコメントしますINSERT。そして今あなたのテーブルとその中のすべてのデータはなくなりました。お奨め

enter image description here

これを処理する適切な方法は、パラメータが結合してプリペアドステートメントを使用することです... little Bobby tablesに気を付けます。これにより、これらの種類の攻撃を防止し、入力を手作業で消毒しようとするよりも信頼性が高くなります。

詳細は、SQLite page for prepared statementsを参照してください。

+2

この「解決策」は、あなたが言うようにSQLインジェクションのバグを作ります。それはまったく解決策ではなく、以前に破棄されたコードを武器化するだけです。 – tadman

+0

@tadman SQLインジェクションが悪い理由の詳細と例を追加し、パラメータバインドの詳細について説明しました。 – dbush

+0

Heh、それはもっと明白な警告ですが、準備された声明のバージョンが最もよいでしょう。 – tadman

関連する問題