2015-07-21 74 views
-1

这里是我要插入值的表:SQLiteException:无法识别的标记: “”:

" create table if not exists "+CipherCongfigTable + 
" (DATABSE_NAME **TEXT** PRIMARY KEY NOT NULL,DATABSE_KEY **TEXT** NOT NULL);"; 

当我想插入

String **configDBPassword**= "**x\'2DD29CA89\'**" 

通过声明

"insert into "+CipherCongfigTable+ " values("+DataBaseName+","+**configDBPassword**+")" 

我收到异常:

无法识别的标记:“\”:

我需要有逃生性格特征相同的格式,即密码。有没有办法做到这一点?

谢谢

+1

我相信它的java创建问题,请尝试\\而不是使用准备好的语句 – Panther

+3

为什么你使用not [insert()](https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase。 html#insert%28java.lang.String,%20java.lang.String,%20android.content.ContentValues%29),而是通过*没有正确引用您的参数来创建SQL注入攻击点。 – dhke

回答

1

不要手工打造INSERT(或任何其他,如果你能避免它)查询在Android(或任何其他数据库的包装,只要有一个预定义的API来获得你想要的)。它会引导您的应用程序引用问题,例如您的问题和最糟糕的问题 - 从您的应用程序之外的SQL注入攻击。

例如,设置configDBPassword = "\"; DROP TABLE <tablename>; --"只要configDBPassword可以由用户输入,我可能会对您的数据库造成严重破坏。

此外,SQLite的使用双引号("),反引号(`,从MySQL借来的),或方括号([],从MS SQL借来的)报价标识符(如列或表名称包含空格) ,字符串文字是单引号(')引号。 SQLite在允许混合使用两种引用类型方面相当宽松,但在适当的情况下使用适当的引用风格的可读性要明显得多。从the documentation

程序员被告诫不要使用前面的项目符号中描述的两个例外。我们强调,它们的存在只是为了使旧的和格式不正确的SQL语句能够正确运行。未来版本的SQLite可能会引发错误,而不是接受上述例外所涵盖的格式错误的语句。

事实上,你应该尽可能避免自己做引用。要插入值,请改为使用SQLiteDatabase.insert(),这是将值插入Android上的SQLiteDatabase的正确方法。它也不会正确引用的论据,也:

db.beginTransaction(); 
    try { 
     final ContentValues values = new ContentValues(); 
     values.put("DATABSE_NAME", DataBaseName); 
     values.put("DATABSE_KEY", configDBPassword); 

     db.insert(CipherCongfigTable, null, values); 
     db.setTransactionSuccessful(); 
    } finally { 
     db.endTransaction(); 
    } 

始终正确引用您的SQL参数。

+0

感谢@dhke现在我正在使用SQLiteStatement来构建sql语句,然后使用SQLiteStatement.execute()。我已经够好了 –

0

试试这个。

"INSERT INTO "+CipherCongfigTable+ " values('DataBaseName','configDBPassword')” 

你是不是在你的插入查询添加单引号(')

编辑: 如果您需要用单qotes手段插入之前使用这样的插入字符串。

configDBPassword = configDBPassword.replace ("'", "''"); 

而且改变你的**

" create table if not exists "+CipherCongfigTable + 
" (DATABSE_NAME TEXT PRIMARY KEY NOT NULL,DATABSE_KEY TEXT NOT NULL);"; 
+0

谢谢阿舍尔。 acutlly我需要单引号(')在密码。有没有办法做到这一点。 –

+0

请不要促进不正确的SQL编码技术。另外,那些报价是什么?为什么? – user2864740

+0

@SidharthDash检查我的编辑 – Amsheer

相关问题