当前位置: 首页 > 面试题库 >

JDBI如何在防止SQL注入的同时动态创建WHERE子句?

晋越彬
2023-03-14
问题内容

我想动态过滤JDBI查询。

参数列表是通过REST从UI传递的,例如

http://localhost/things?foo=bar&baz=taz
http://localhost/things?foo=buz

这是(笨拙地)构建(Jersey @Context UriInfo :: getQueryParameters->
StringBuilder)的,类似于以下内容:

WHERE foo=bar AND baz=taz

并传递给JDBI,它看起来像这样:

@UseStringTemplate3StatementLocator
public interface ThingDAO {
   @SqlQuery("SELECT * FROM things <where>)
   List<Thing> findThingsWhere(@Define("where") String where);
}

据我了解,当前的实现容易受到SQL注入的攻击。我显然可以清除列名,但不能清除值。1个

必须有一种更优雅且SQL注入证明的方法来执行此操作。


问题答案:

受让-贝纳德(Jean-Bernard)的启发,我想到了这一点:

public class WhereClause {
    public HashMap<String, String> queryValues; // [<"foo","bar">, <"baz","taz">]
    public String preparedString; // "WHERE foo=:foo AND bar=:baz"
}

通过一个自定义的Binder绑定BindWhereClause

@BindingAnnotation(BindWhereClause.WhereClauseBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface BindWhereClause {
    class WhereClauseBinderFactory implements BinderFactory {
        public Binder build(Annotation annotation) {
            return new Binder<BindWhereClause, WhereClause>() {
                public void bind(SQLStatement q, BindWhereClause bind, WhereClause clause) {
                    clause.queryValues
                            .keySet()
                            .forEach(s -> q.bind(s, clause.queryValues.get(s)));
                }
            };
        }
    }
}

和的组合@Define@Bind

@UseStringTemplate3StatementLocator
public interface ThingDAO {
   @SqlQuery("SELECT * FROM things <where>")
   List<Thing> findThingsWhere(@Define("where") String where, 
                               @BindWhereClause() WhereClause whereClause);
}

这应该是防注射的。(是吗?)



 类似资料:
  • 我正在使用jdbc PreparedStatement进行数据插入。 tablename和columnString是动态生成的。 我尝试过参数化tablename和columnString,但它们只会解析为类似'tablename'这样的东西,这将违反语法。

  • 的计算类似于: 这里的是环境的名称(可以随时间改变),是表名(将固定)。 的值来自文件,该文件使得查询容易受到SQL注入的攻击。 有没有人可以建议我,有什么可能的方法来处理这件事? 注意:我们将来可以迁移到DB2,因此该解决方案应该与Oracle和DB2兼容(如果可能的话,应该与数据库无关)。

  • 注意:但凡是sql注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成sql语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的【外部数据不可信任】的原则,纵观web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到,就是变量的检测、过滤、验证下手,确保变量是开发者所预想的。 1、检

  • 本文向大家介绍ThinkPHP如何防止SQL注入?相关面试题,主要包含被问及ThinkPHP如何防止SQL注入?时的应答技巧和注意事项,需要的朋友参考一下 (1)查询条件尽量使用数组方式,这是更为安全的方式; (2)如果不得已必须使用字符串查询条件,使用预处理机制; (3)使用绑定参数 (4)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了) (5)使

  • 所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶意)的 SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。比如先前的很多影视网站泄露 VI

  • 问题内容: 我与一个声誉很高的PHP专家进行了讨论: PDO在这里没有用。以及mysql_real_escape_string。质量极差。 这当然很酷,但是老实说我不知道​​建议使用or PDO修复此代码有什么问题: 入这个 ,考虑到JavaScript代码已发送到客户端。 问题答案: 您的建议确实不正确。 不适用于动态表名;它旨在转义仅 由引号分隔的字符串数据 。它不会逃脱反引号字符。这是一个很