Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式创建数据库并保证注入安全?_Java_Database_Security_Jdbc_Sql Injection - Fatal编程技术网

Java 如何以编程方式创建数据库并保证注入安全?

Java 如何以编程方式创建数据库并保证注入安全?,java,database,security,jdbc,sql-injection,Java,Database,Security,Jdbc,Sql Injection,非DDL语句可以而且在任何情况下都应该受到SQL注入的保护。在JDBC中,这是通过PreparedStatement和CallableStatement完成的,它们允许插入参数,但不能用于DDL语句 第三个是语句,它允许DDL语句,但不提供参数插入。我需要手动检查数据库名称,以防止出现类似x;DROP database“customer\u data这样的数据库名称。这种手动检查感觉既像是重新发明轮子,又像是自己做安全检查,这两个都是糟糕的想法 我是否缺少JDBC函数?以编程方式创建数据库是否有

非DDL语句可以而且在任何情况下都应该受到SQL注入的保护。在JDBC中,这是通过
PreparedStatement
CallableStatement
完成的,它们允许插入参数,但不能用于DDL语句

第三个是
语句
,它允许DDL语句,但不提供参数插入。我需要手动检查数据库名称,以防止出现类似
x;DROP database“customer\u data
这样的数据库名称。这种手动检查感觉既像是重新发明轮子,又像是自己做安全检查,这两个都是糟糕的想法


我是否缺少JDBC函数?以编程方式创建数据库是否有害?存储过程是否提供了额外的保护级别?是否有维护良好且经过审核的库,用于检查数据库名称和传递给DDL语句的类似变量。

即使在支持DDL作为准备语句的数据库中(例如,MySQL,请参阅),模式名称和列名等标识符也不能作为参数

只能在使用常量值(如带引号的字符串、带引号的日期/时间或数字文字)的情况下使用查询参数。不适用于标识符

因此,您需要小心使用标识符。在将它们插入DDL语句之前,将它们列为白名单或在应用程序代码中进行某种模式匹配。不要只接受任何输入或不受信任的内容,在DDL中一字不差地使用它们,而不以某种方式对其进行过滤


过滤并不是那么难。我们在应用程序代码中执行与正常工作类似的安全检查,比如在假设可以调用对象的方法之前检查对象是否为
null
。或者在将数字用作除数之前检查数字是否为零。

虽然有些用例中以编程方式创建数据库是合法的,但您的最后一句话让我相信您不确定是否真的有这样的用例…?我想在可以在主机之间移动的数据库中分离客户。客户(数据)创建是以编程方式完成的,因此是数据库创建。那么,基本准备好的语句允许在查询结构(您希望它在哪些表和哪些列上执行的操作)和特定值之间进行分离,从而提供保护,防止更改查询结构。如果您是以编程方式生成结构,那么根据定义,就不可能有真正的保护,您只能靠自己。最近感谢您的输入。关于“过滤没那么难”:我的问题不是很难解决问题。我想把它做好。这是不同的。我觉得我自己在做安全工作,这在实施这些过滤器和检查时不是一个好主意。像jooq这样的工具是解决方案吗?安全是开发人员的责任。像jOOQ这样的框架有一些特性,可以方便地使用引号标识符(请参阅),但这些特性的使用取决于您。我的意思是,不要只是盲目地将字符串连接在一起,而不使用提供的函数来引用标识符。