这个问题的目的是不来弄清楚如何防止SQL注入尝试。
相反,我想知道,如何检测一行中的SQL代码行 ( Android Class )文件
与其他SQL解析器线程不同,我想在 Android 中工作,我只是在使用正则表达式之类的东西,它可用于检测当前的SQL代码线
我有 Android 代码的示例页面,如下所示:
String query = "select * from users_table where username = '" + u_username + "' and password = '" + u_password +"'";
SQLiteDatabase db
//some un-important code here...
Cursor c = db.rawQuery( p_query, null );
return c.getCount() != 0;
}
其中有一行 SQL 代码,如:
select * from users_table where username = '" + u_username + "' and password = '" + u_password +"'
我有一个类似下面的函数,它逐行读入( Android Class )文件。然后返回String的ArrayList。
public ArrayList<String> SQLStatementsfromFile(File fileLocation) throws IOException {
ArrayList<String> SQLStatements = new ArrayList<>();
FileInputStream is;
BufferedReader reader;
if (fileLocation.exists()) {
is = new FileInputStream(fileLocation);
reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
while (line != null) {
line = reader.readLine();
if (line != null) {
if (!line.isEmpty()) {
if (line.contains(SQL))
SQLStatements.add(line);
}
}
}
}
return SQLStatements;
}
我想知道的是:是否有任何可能的 Regex 语句(或其他代码检测方法)可用于从每行android代码中检测SQL代码(所以它可以添加到ArrayList SQLStatements )?
要清楚,请不要给我上面写的示例代码的提示。
或者就给出的例子提出建议。只需请,而不是尝试回答我的问题。
我知道SQL等中的参数化语句更安全,但这是 NOT 为什么我打开这个线程,上面只是我想要检测的SQL代码的例子(不我计划使用的SQL代码)。
谢谢: - )
答案 0 :(得分:0)
假设任何有效 SQL语句必须以INSERT INTO
,UPDATE
,SELECT
或DELETE
开头,并以分号结尾{{1你可以使用以下代码找到sql:
;
首先,你写的sql不是我认为有效的,因为它缺少结尾的分号。
如果你能确保sql的synax遵循我之前说过的规则,那么结束Java代码行的/(?:INSERT INTO|UPDATE|SELECT|DELETE)(?:[^;'"]|(?:'[^']*?')|(?:"[^"]*?"))+;/i
不应该干扰这个正则表达式。
如果没有分号,您的示例代码不匹配,但插入分号就可以了。示例: