English 中文(简体)
这是逃避 SQL 查询参数的安全方法吗?
原标题:Is this a secure method of escaping a SQL query parameter?

在我的工作中,它曾经是传统,通过不安全地将参数连接到查询字符串中来形成 SQL 查询。 这当然导致 SQL 注射易感性。 这并没有被视为一个大问题, 因为发生这种情况的所有 Java 软件都在封闭的网络上运行, 假设所有用户都相信这些网络。 另外, 查询是从有数据库访问功能的客户端应用程序中进行, 这样用户就可以在技术上执行恶意查询 。

尽管如此,它还是计划支持新版数据库层中的预编报表。 与此同时,我在现有数据库层之上写了一个小图书馆(它只支持执行 SQL String 的查询,而没有选择预编的报表或参数逃跑 ), 这样就可以通过逃避字符串参数来写出安全的参数查询。

作为这个图书馆的一部分, 我写了以下方法, 脱离字符串字句。 我摆脱了与 PHP s 附加鞭笞功能相同的字符, 但我试图通过检测补充字符( 32比特) 来避免多字字字符脆弱性 :

private String escapeString(String str)
{
    List<Character> toEscape = Arrays.asList(   ,  " ,  \ ,   );

    StringBuilder result = new StringBuilder();
    for(int i = 0; i < str.length(); ++i)
    {
        char c = str.charAt(i);

        if(i < str.length() - 1 && c >=  uD800  && c <=  uDBFF )
        {
            char next = str.charAt(i + 1);

            if(next >=  uDC00  && next <=  uDFFF )
            {
                // Two-char supplementary character. Escape neither.
                result.append(c);
                result.append(next);
                ++i;
                continue;
            }
        }

        if(toEscape.contains(c))
        {
            // Special character. Add escaping .
            result.append( \ );
        }

        // Copy character itself.
        result.append(c);
    }

    return result.toString();
}

我的问题是,这种逃避查询的方法是否足够安全(而我并没有监督任何事情,或者犯了执行错误 ) 。 可以假定输入字符串是有效的 UTF-16。 DBMSs 将使用 MySQL 和 Oracle 。

问题回答

没有ORM、已准备好的报表或储存的程序,我对SQL的清理程序应谨慎行事。

没有 No.

假设您有一个整数字段, 他们输入 PIN :

" PIN = " + 清扫剂

and then for input you type in: 1234 OR 1 = 1

而现在你的"pin"总是被接受的, 没有任何有趣的人物被使用。

这也可以用于除内特外的字段(因为是的,你可以验证一内特输入在移交给 SQL之前实际上是一个内特) 。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签