当前位置: 首页 > 知识库问答 >
问题:

这是一种安全的转义SQL查询参数的方法吗?

禄奇希
2023-03-14

在我的工作中,传统的做法是不安全地将参数连接到查询字符串中来形成SQL查询。当然,这会导致SQL注入漏洞。这并不被认为是一个大问题,因为发生这种情况的所有Java软件都运行在封闭的网络上,所有用户都被认为是可信的。此外,查询是从具有数据库访问权限的客户端应用程序执行的,因此从技术上讲,用户无论如何都可以执行恶意查询。

尽管如此,它计划在数据库层的新版本中支持准备好的语句。同时,我在现有的数据库层上编写了一个小库(它只支持从SQL字符串执行查询,没有准备好的语句或参数转义选项),它允许通过转义字符串参数来编写安全的参数化查询。

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

    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();
}

共有1个答案

公良运锋
2023-03-14

如果没有ORM、准备好的语句或存储过程,我会对任何字符串SQL净化例程保持谨慎。

 类似资料:
  • 我今天的问题是。我需要在我的脚本中转义PDO吗? 整个脚本可在中找到。https://github.com/joshuahiwat/crud/blob/master/control/query_connector.class.php 有人能解释一下为什么我现在需要逃跑,或者为什么不需要。 我很想收到你的来信,非常感谢!

  • 问题内容: 我有一个应用程序,通过将动态mysql查询与mysql(mysqli)实际转义字符串结合使用,将大大受益。如果我运行了通过mysql真正的转义从用户那里收到的所有数据,那么它与使用mysql预准备语句一样安全吗? 问题答案: 虽然标题中的问题是模棱两可的, 可以 解释为“动态mysql查询的 每个部分 格式 是否正确……”,因此有肯定的答案,但正文中的问题 不是 : 如果我运行了通过m

  • 问题内容: 我尝试了所有形式的Python模块,它们要么逃逸太多,要么以错误的方式逃逸。在Python中找到转义引号(“,’)的最佳方法是什么? 问题答案: 如果它是数据库查询的一部分,则应该可以使用Parameterized SQL Statement 。 除转义引号外,这还将处理所有特殊字符并保护您免受SQL注入攻击。

  • 问题内容: 我使用的是codeigniter,大多数时候都使用活动记录进行查询(这会自动使它们转义),但是由于变量的原因,该查询似乎不太适合它。因此,我需要弄清楚如何手动转义查询。 Codeigniter文档建议以这种方式转义查询: 我的原始查询 我逃脱的查询 但是我在正确使用语法上遇到了麻烦。错误消息是: PHP错误消息:未定义的变量:user_language SQL错误:语法错误…在第1行的

  • 问题内容: 我正在尝试在vb.net中使用sql查询插入数据,如下所示。名称= corp int’l poc = 1 当我尝试插入时,出现错误(“字符串’“之后的未封闭的引号)。当我尝试仅用1个单引号插入名称时,就会发生这种情况。 因此,我添加了一个replace函数,以将2个单引号替换为1个单引号来转义符号。没有错误,但是当我查看数据库时,添加了2个单引号而不是1个。 谁能告诉我如何通过参数化查

  • 问题内容: 我们可以创建相同的GET URI,但使用不同的查询参数吗? 例如,我有两个REST GET URI: 现在,REST服务无法将两个GET方法识别为单独的,而仅将其声明为第一个GET方法。 为什么会这样呢? 有什么办法可以使两个具有不同查询参数的GET方法? 如果您可以引用任何资源,将不胜感激。 问题答案: 因为 资源 是由其 PATH 唯一标识的,而不是由其参数唯一标识的。您定义的两个