使用 org.postgresql.core.Utils.escapeLiteral 足以防止 SQL 注入吗?

2024-02-03

在构建 SQL 查询和更新以提交到我的数据库之前,我需要清理一些用户输入的数据。

我知道最好使用准备好的陈述 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1:_Prepared_Statements_.28with_Parameterized_Queries.29但这不是一个选择。不幸的是,我被困住了转义所有用户提供的输入 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_4:_Escaping_All_User_Supplied_Input.

看起来 Postgres JDBC 库附带了一个进行字符串转义的工具。看org.postgresql.core.Utils.escapeLiteral(..)(见下文)。我希望由于 Postgres 附带了它,因此可以安全使用。经过几个小时的谷歌搜索和查看 SQL 备忘单后,我无法找到可以打破这个问题的示例。

以下看起来足够安全吗?

public class FruitDb {

    private Connection connection;

    public void findFruit ( String /* user enterable field */ fruitColor ) {

        String query = "SELECT * FROM fruit WHERE fruit_color = " + quote( fruitColor );

        Statement statement = connection.createStatement();
        statement.executeQuery( sql );
    }

    private String quote( String toQuote ) {
        return "'" + Utils.escapeLiteral( null, s, true ).toString() + "'";
    }

}

对于那些对此感兴趣的人来说是实施Utils.escapeLiteral。对我来说看起来相当安全......

package org.postgresql.core;
class Utils { 

    ... 

    /**
     * Escape the given literal <tt>value</tt> and append it to the string builder
     * <tt>sbuf</tt>. If <tt>sbuf</tt> is <tt>null</tt>, a new StringBuilder will be
     * returned. The argument <tt>standardConformingStrings</tt> defines whether the
     * backend expects standard-conforming string literals or allows backslash
     * escape sequences.
     * 
     * @param sbuf the string builder to append to; or <tt>null</tt>
     * @param value the string value
     * @param standardConformingStrings if standard conforming strings should be used
     * @return the sbuf argument; or a new string builder for sbuf == null
     * @throws SQLException if the string contains a <tt>\0</tt> character
     */
    public static StringBuilder escapeLiteral(StringBuilder sbuf, String value, boolean standardConformingStrings)
        throws SQLException
    {
        if (sbuf == null)
        {
            sbuf = new StringBuilder(value.length() * 11 / 10); // Add 10% for escaping.
        }
        doAppendEscapedLiteral(sbuf, value, standardConformingStrings);
        return sbuf;
    }


    private static void doAppendEscapedLiteral(Appendable sbuf, String value, boolean standardConformingStrings)
        throws SQLException
    {
        try
        {
            if (standardConformingStrings)
            {
                // With standard_conforming_strings on, escape only single-quotes.
                for (int i = 0; i < value.length(); ++i)
                {
                    char ch = value.charAt(i);
                    if (ch == '\0')
                        throw new PSQLException(GT.tr("Zero bytes may not occur in string parameters."), PSQLState.INVALID_PARAMETER_VALUE);
                    if (ch == '\'')
                        sbuf.append('\'');
                    sbuf.append(ch);
                }
            }
            else
            {
                 // REMOVED.  I am using standard encoding. 
            }
        }
        catch (IOException e)
        {
            throw new PSQLException(GT.tr("No IOException expected from StringBuffer or StringBuilder"), PSQLState.UNEXPECTED_ERROR, e);
        }
    }
}

类似问题:

  • 如何使用 Java 在 PostgreSQL 中安全地转义 SQL 的任意字符串 https://stackoverflow.com/questions/9741206/how-to-safely-escape-arbitrary-strings-for-sql-in-postgresql-using-java/43645849#43645849 - 我实际上回答了这个建议使用 Utils.escapeLiteral(..)因为我认为这是一个比预期答案更好的解决方案。
  • 我可以通过转义单引号并用单引号包围用户输入来防止 SQL 注入吗? https://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and-surrounding-use
  • 非常好的帖子: SQL Server 中的 SQL 注入如何击败转义单引号的卫生措施? https://stackoverflow.com/questions/15537368/how-can-sanitation-that-escapes-single-quotes-be-defeated-by-sql-injection-in-sq

是的,使用 escapeLiteral() 和 escapeIdentifier() 是安全的。

事实上,escapeLiteral() 和 escapeIdentifier() 是 libpq 中定义的 PQescapeLiteral() 和 PQescapeIdentifier() 的补充。

主要区别是 JDBC 的 escapeLiteral() 不考虑数据库连接来验证字符编码。然而,Java的内部编码是Unicode并转换为数据库字符编码。因此,这并不重要。

我注意到的另一个区别是字符串如何转义为 SQL Literal。 PQescapeLiteral 为字符串添加引号,但 escapeLiteral() 没有。例如abc'xyz用 PQescapeLiteral() 变成了 'abc''xyz',但它变成了abc''xyz(注意结果周围没有引号)

escapeIdentifier() 就像 PQescapeIdentifier() 一样添加引号。例如abc"xyz became "abc""xyz"

CERT 前 10 名安全编码实践 #7(清理输出)建议清理所有变量,无论之前的检查/验证如何。人们可以通过使用预备查询来避免使用 escapeLiteral(),但不能使用 escapeIdentifier(),因为预备查询无法分隔参数化标识符。 IE。

SELECT user_specified_col FROM tbl;

or

SELECT * FROM tbl ORDER BY user_specified_col;

开发人员必须严格验证“user_specified_col”,但他们必须清理参数,以防验证不当。即输出净化必须独立完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 org.postgresql.core.Utils.escapeLiteral 足以防止 SQL 注入吗? 的相关文章

  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • PostgreSQL函数中sql语言和plpgsql语言的区别

    我很新数据库开发所以我对下面的例子有一些疑问 函数 f1 语言 SQL create or replace function f1 istr varchar returns text as select hello varchar istr
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 谷歌如何通过两步验证识别“可信设备”

    假设您已注册您的设备 当您返回网站时 它使用哪些信息来验证您是否在该设备上 它是否在您的计算机上存储某些内容 例如 cookie 或者是否使用其他算法来确定您从何处登录 它存储有关您与服务器对话的各种信息 SSL cookie 会话数据 例
  • 如何使用 HTML5 Geolocation API 实现承诺?

    我怎样才能更正下面的代码 使其不返回undefined的值getPreciseLocation功能 总之 当用户点击时 应该有一个 AJAX 调用来获取当前天气 precise location prompt并与浏览器共享位置 然而目前有一
  • 为什么“NOT IN”在这个 NSPredicate 中不起作用?

    A b and B a是逆多关系 为什么这个谓词是A work NSPredicate predicate NSPredicate predicateWithFormat NOT SELF IN bObject a 而这个则没有 NSPre
  • 如何在 websocket python 中发送“标头”

    我怎样才能做到这一点 这是我的代码 import websockets async def test async with websockets connect ws iqoption com as websocket response a
  • 在浏览器之外使用 Websockets 有什么充分的理由吗?

    Websocket 专为浏览器中的快速双向通信而设计 假设您可以控制服务器和本机客户端 例如 iOS 或 Mac 应用程序 是否有任何充分的理由或情况可以通过 Websocket 进行通信而不是使用 HTTP 库 我将回答几个不同的问题 希
  • tableview图像内容选择颜色

    我的应用程序有一个带有图像和文本字段的表格视图 image 图像渲染为模板图像 浅灰色 文本字段 文本颜色黑色 如果我选择一行 两者的颜色都会完美地变为白色 问题 我将图像更改为蓝色图像 默认渲染 如果我现在选择一行 文本字段的文本颜色将更
  • 在 fp-ts 的管道中混合 Either 和 TaskEither

    当没有一个函数是异步的时 我有以下程序可以正常工作 interface Product count number pricePerItem number interface Tax tax number interface Delivery
  • UITableView 上的动画 reloadData

    你会怎样动漫 reloadData on UITableView 数据源已开启UIFetchedResultsController所以我不能玩 insertSections withRowAnimation deleteSections w
  • 从 UITableView 中的 URL 加载图像速度缓慢。

    我正在从 UITableView 中的 URL 加载图像 但加载视图时速度非常慢 这是一个例子 UIImage image nil image UIImage imageWithData NSData dataWithContentsOfU
  • asp.net c# 中是否有等效的 echo

    我有一个 php 代码 我已将其转换为 asp net 代码 PHP 代码只是回显客户端读取和解释的响应 但是在 asp net 中 生成的输出被迫采用 html 格式 这正是因为我使用 asp net 标签来打印输出 有没有一种方法可以实
  • 将整个文档移动到 iframe 中

    我想做的是将一个完整的网站包装在一个iframe不破坏任何样式或 JavaScript 这是我尝试过的 var frame css position fixed top 0 left 0 width 100 height 100 appen
  • Spring @Autowired 不工作 - BeanCreationException

    当我尝试在服务器上部署文件时发生错误 我很困惑 因为这段代码有效 例外 Failed to enable lec2ear 1 0 ear Unexpected HTTP response 500 Request address gt dep
  • 如何仅使用标准网络库发送 HTTP 响应?

    我正在 Web 编程课程中完成我的第一个作业项目 即用 Java 编写一个简单的 Web 服务器 我正处于来回传输数据的阶段 在未经训练的人看来 我的小型服务器似乎工作正常 但是 我找不到发送适当回复的方法 换句话说 无效的页面请求将显示
  • 现有字符串加倍

    如何将现有字符串更改为双精度字符串 我有这样的代码声明为字符串 但实际上它从数据库获取数字 我正在做数字转换 但现在我不想将其转换为字符串并将其一路获取为数字 private String example1 example1 new Str
  • 我可以拆分grails的config.groovy文件吗?

    由于里面有敏感代码config groovy文件 我担心我的朋友会犯这个文件中的错误 当得到svn更新后 我们也会得到有问题的配置代码 我可以将代码拆分为config groovy是否可以使敏感代码保持不变 而其他代码可以经常更改 在主配置
  • Matlab模拟:点(符号)从起点移动到终点并返回

    我想创建一个动画来演示基于 LDPC 编码和积算法 http en wikipedia org wiki Belief propagation 到目前为止 我已经创建了一个图表 显示符号节点 左 和奇偶校验节点 右 之间的连接替代文本htt
  • 您将如何使用 Sklearn 的 VotingClassifier 进行 RandomizedSearchCV ?

    我正在尝试调整我的投票分类器 我想在 Sklearn 中使用随机搜索 但是 由于我当前使用两种算法 不同的树算法 如何为我的投票分类器设置参数列表 我是否必须单独运行随机搜索并稍后在投票分类器中将它们组合在一起 有人可以帮忙吗 代码示例将受
  • Docker Maven Spotify 插件 - 可以切换到非安全注册表

    我正在使用Spotify Maven 插件 http mvnrepository com artifact com spotify docker maven plugin在执行某些 Maven 目标时自动构建和部署 docker 镜像 但是
  • jQuery if 语句,语法

    什么是一个简单的 jQuery 语句 该语句声明仅当 A 和 B 为 true 时操作才会继续 如果 A 不为真 则停止 如果 A 和 B 为真 则继续 jQuery 只是一个增强 Web 浏览器中 DOM 功能的库 底层语言是 JavaS
  • 使用 org.postgresql.core.Utils.escapeLiteral 足以防止 SQL 注入吗?

    在构建 SQL 查询和更新以提交到我的数据库之前 我需要清理一些用户输入的数据 我知道最好使用准备好的陈述 https www owasp org index php SQL Injection Prevention Cheat Sheet