如何在android代码页面中检测SQL代码的存在?

时间:2015-06-23 14:58:20

标签: java android sql regex sqlite

  

这个问题的目的是来弄清楚如何防止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代码)。

谢谢: - )

1 个答案:

答案 0 :(得分:0)

假设任何有效 SQL语句必须以INSERT INTOUPDATESELECTDELETE开头,并以分号结尾{{1你可以使用以下代码找到sql:

;

首先,你写的sql不是我认为有效的,因为它缺少结尾的分号。

如果你能确保sql的synax遵循我之前说过的规则,那么结束Java代码行的/(?:INSERT INTO|UPDATE|SELECT|DELETE)(?:[^;'"]|(?:'[^']*?')|(?:"[^"]*?"))+;/i 不应该干扰这个正则表达式。

如果没有分号,您的示例代码不匹配,但插入分号就可以了。示例:

https://regex101.com/r/zB2yJ1/1