Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 这个简单的字符串转义可以防止任何SQL注入吗?_Java_Sql_Security_Jdbc_Sql Injection - Fatal编程技术网

Java 这个简单的字符串转义可以防止任何SQL注入吗?

Java 这个简单的字符串转义可以防止任何SQL注入吗?,java,sql,security,jdbc,sql-injection,Java,Sql,Security,Jdbc,Sql Injection,我在一家公司工作,负责数据库模块的人严格禁止使用事先准备好的语句。我担心他的实施不安全 下面是我们当前用于进行SQL查询的代码(带有JDBC/MySQL 5.5的Java 8应用程序): 我没有办法打针,但他的解决方案对我来说似乎很可疑。有人能指出怎样才能避免这次逃跑吗?如果我想不出任何东西,而且我们的应用程序(银行)中有数千名客户的非常敏感的信息,他将不会替换他的代码 编辑: 不幸的是,我无法显示executeSQL(),因为庞大的类层次结构非常混乱,而且所有内容都是分散的。但归根结底是这样的

我在一家公司工作,负责数据库模块的人严格禁止使用事先准备好的语句。我担心他的实施不安全

下面是我们当前用于进行SQL查询的代码(带有JDBC/MySQL 5.5的Java 8应用程序):

我没有办法打针,但他的解决方案对我来说似乎很可疑。有人能指出怎样才能避免这次逃跑吗?如果我想不出任何东西,而且我们的应用程序(银行)中有数千名客户的非常敏感的信息,他将不会替换他的代码

编辑: 不幸的是,我无法显示executeSQL(),因为庞大的类层次结构非常混乱,而且所有内容都是分散的。但归根结底是这样的:

String query = ... // query escaped with the above function
java.sql.Connection connection = ...
Statement stmt = connection.createStatement();
stmt.executeUpdate(query);

一种攻击方法是“加载”攻击

首先,您可以将用户名、银行转帐消息等任何内容注入其中

转移0.01
收件人:020.020202.200202
名称:johnny tables";;放下桌上的食物吧--

将逃到

johnny tables\';drop table foobar  --
到目前为止还不错。有效的保护。我们的联系失败了。我们尝试加载攻击

现在我们要做一个预定的付款单

这是假设发生了一个常见错误,即一旦插入数据库,该值就“安全”,因为它已被检查过一次

转移0.01
收件人:020.020202.200202
名称:johnny tables";;下拉表foobar--
日程安排:1天后

将订单存储在数据库中

'johnny tables\';drop table foobar--'
将存储为

约翰尼·泰尔斯;放下桌上的食物吧--

现在在午夜,调度程序开始启动并开始迭代计划的付款

select name from scheduled where time > x and < y
砰的一声,你的桌子掉了<代码>*

在执行手动操作时,必须确保转义变量的所有实例、所有unicode字符、数据库引擎的所有特性

此外,使用准备好的语句可以显著提高速度,因为您不必重新生成查询。只需构建一次,将其存储在缓存中,然后交换参数即可。
尤其是在迭代大型列表时,它们简直是天赐良机

根本问题是他可能不理解事先准备好的语句,不了解它们是如何工作的。被触发的不安全感会以某种方式造成攻击性和保护性,甚至狂热,只是为了防止你承认自己不知道它们是如何工作的。
试着和他谈谈这件事,如果他不愿意听他的理由,就去找他的经理解释这个问题,如果网站/应用被黑客攻击,它将由你的同事和经理负责,并告诉他风险是巨大的。以最近的黑客攻击为例,很多钱都像斯威夫特黑客一样被偷了


*
根据实际的查询、联接、联合等,可能无法实际工作。。这是一个非常简化的示例

您没有包含
replaceSingleQuotes()
方法。是的,这可能是个坏主意。即使你现在侥幸逃脱,接下来的一个小重构可能会带来注入机会。那个人是否应该因为故意在你的系统中制造漏洞而被解雇?是否应该反对使用预先准备好的语句?这是第一次。也祝贺有这样一个人负责数据库模块。这里的问题不是这个代码是否安全。问题是,如果一个人宁愿使用自己的“解决方案”而不是行业标准,那么他可能还有其他怪癖。这是一个严重的安全问题,你也不会让这个家伙建立自己的银行保险库。从我看到的可能的重复,我猜提议的“API”将在每次读取数据时(正常使用)都不安全,所以不会像那样使用。但如果我猜错了,这将是一个非常好的安全问题!从未见过它的行动,但我喜欢这种攻击!我的印象是,这是入侵数据库的标准方法,他们使用这种安全性:-)但那是因为我见过其他程序员(他们的工资比我高)使用的代码,我发现了安全性方面的缺陷,因为我不希望我的老板对我大喊大叫:-)相信我说,互联网上的漏洞比筛子还多,像OP的同事这样的程序员比与时俱进的人更为常见。我知道有一个飞行引擎,我可以用一个查询擦除整个数据库。。。我告诉老板,让他们使用事先准备好的陈述,否则我拒绝使用
select name from scheduled where time > x and < y
String name = result['name'];
String acct = result['acct'];
String amt = result['amt'];
string query = "insert into payment_process (name,acct,amt) values('"+name+"','"+acct+"','"+amt+"');