【发布时间】:2014-02-25 22:47:56
【问题描述】:
我正在制作一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我有与数据库条目匹配的“alex|ppp”。 首先调用下面的方法
private void rememberedLogIn(){
String filename = "UserInfo.txt";
String info = "";
String user = "";
String pass = "";
try{
FileInputStream fIn = openFileInput(filename);
BufferedReader r = new BufferedReader(new InputStreamReader(fIn));
info = r.readLine();
}catch(IOException e){
e.printStackTrace(System.err);
}
for(int i =0; i < info.length();i++){
if(info.charAt(i) == '|' ){
user = info.substring(0,i);
pass = info.substring(i+1);
GlobalVar.loggedIn= true;
break;
}
}
new InitialStuff().execute(user,pass);
}
我已经仔细检查了 user 和 pass 的值,它们是预期的“alex”和“ppp”。接下来调用InitialStuff,相关代码如下:
public class InitialStuff extends AsyncTask<String, Void, Toon>{
int prog = 0;
@Override
protected Toon doInBackground(String... params) {
android.os.Debug.waitForDebugger();
Toon toon = null;
Database db = new Database();
db.establishConnection();
if(db.tryLogIn(params[0], params[1])){
prog = 2;
publishProgress();
toon = db.getToonFromDB(params[0]);
prog = 4;
}else prog = 3;
publishProgress();
return toon;
}}
一旦我调用看起来像这样的 db.tryLogin() 就会出现问题
public boolean tryLogIn(String toonName, String toonPass){
try{
while(!connected) establishConnection();
String sqlQuery = "SELECT Password FROM Toons WHERE Name LIKE '" + toonName+"';";
Statement stmt = con.createStatement();
ResultSet rSet = stmt.executeQuery(sqlQuery);
if(rSet.next()){
String dbPass = rSet.getString(1).trim();
if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE
return true;
}
}
catch(Exception e){ }
return false;
}
我检查了 dbPass 从数据库返回为“ppp”,它与 toonPass 匹配,但它会跳过返回 true 并改为返回 false。
如果有帮助,这是 eclipse 给我的关于这两个的信息
toonPass "ppp" (id=830041185816)
数 3
hashCode 0
偏移量 5
值(id=830041185744)
[0] 一个
[1] 升
[2] 电子
[3] x
[4] |
[5] p
[6] p
[7] p
dbPass "ppp" (id=830041708816)
数 3
hashCode 0
偏移量 0
值(id=830041709136)
[0] p
[1] p
[2] p
请注意,我还尝试将“ppp”传递给 tryLogin() 方法,而不将其作为子字符串,以防与问题有关并且结果相同。
编辑:我解决了这个问题......排序。我刚刚停止使用 .equals() 方法,而是使用 for 循环来比较每个字符串中的字符
【问题讨论】:
-
无关,但是sql注入。
-
这是我第一次在我的编程中处理外部数据库,我不得不自学,所以请原谅我缺乏知识......你是什么意思?
-
SQL 注入示例之一:xkcd.com/327 -> stackoverflow.com/questions/332365/…
-
@user3293629 考虑如果
toonName是"foo' or '1' = '1"会发生什么 -
我很高兴你为什么在
hashCode和toonPass和dbPass中都得到0,因为我得到了111216。在不相关的注释上,给你一些提示:1)不要完成后忘记close()FileInputStream fIn和BufferedReader r。 2)for-loop and if-block用于查找管道“|”字符可以更改为indexOf("|")。 3)不要忘记在不使用时删除waitForDebugger()。 4) 如前所述,小心 SQL 注入。 5)如果当前不使用,不要忘记关闭与数据库的连接。
标签: java android string equals