java去除sql注释,自定义注释在Java中用于SQL注入安全p

bc3f9276acf88283a0569b9b9ef9ee92.png

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

Java开发人员,您好:在当今的ORM世界中,为了持久化,我们主要使用基于JPA的实现。

我们还经常在休眠状态,Spring数据或Spring JDBC模板上使用JPA。

尽管这些框架已经在很大程度上解决了SQL注入问题,但我们确实遇到了某些情况,在这些场景中您仍然想验证验证的数据字符串是否对SQL注入安全性。

以防万一有人怀疑什么是SQL注入,您可以在这里查找它以进行简单介绍:http:// www。w3schools。com / sql / sql_injection。天冬氨酸

我们应该记住,如果使用不当,即使使用最好的工具也无济于事。

我的意思是,永远不要与值一起构造数据库查询(以防万一,自己编写)。 例如:

相反,您应始终确保您的实现使用准备好的语句和参数,例如:此示例显示了命名参数的用法,它也可能只是 如果您只是使用基于位置的参数。 就SQL注入而言,这是非常安全的。

回到我们的讨论中,如果您仍然想验证验证的参数参数是否是SQL注入安全的,则可以采用的一种方法是创建一个 自定义注释 为了这。

这就是我采取的方法。 我正在与您分享,希望对您有所帮助。

我主要将其用于基于Spring的休息启发式Web应用程序。

所以我的示例项目将使用spring boot。

因此,让我们动手吧。

如果您有一个简单的Java项目,那么第一件事就是定义注释接口

这很简单。 您定义注释名称和代码的目标部分。

您应该注意

这将帮助您在基线和参数(最有可能用于输入数据的地方)上使用注释。

并且您还指定数据的验证器。

我们将在下一部分中查看验证器。

在Annotation接口中,我们指定了验证器:

现在,让我们创建验证器本身,它是SQL注入安全注释的大脑。

在方法中,我们将验证委托给另一种方法 , 这就是魔术发生的地方。

首先,我们对预期的dataString是否为null安全进行了安全检查。 因此,我本可以使用公地 。

但是,我想使注释校准地独立。 因此,我们有自己的方法,它与apache-commons实现非常相似。

然后,我们通过一系列正则表达式运行数据字符串,并使其与SQL恶意数据的任何标准模式匹配。 在第一组正则表达式中,我们验证它是否与以下任何简单SQL模式匹配:

下一组表达式是:

这些正则表达式与 。 它确保您不会创建,更改,构造,锁定,释放或描述如下表,视图,转换等之类的sql类型。 受保护的sql类型的完整列表来自此常量

我试图从我的角度创建可以完成的sql类型列表。

接下来是用于检测SQL中破坏性字符的最后一组表达式:

如果需要,您可以扩展 以及更进一步的正则表达式集。

另外要注意的一件事是,我们正在预先整合模式对象。 通常创建模式对象是比较耗时的部分。 现在我们已经在构造本质上,我们可以预期性能会有所改善(非常轻微的改善,总比没有好;-))。

现在,您可以使用注释预设和参数

例如。

我主要用在Spring MVC控制器 验证预设的请求参数。

不幸的是,您不能直接使用我们的注释来注释a并期望它能工作。 Spring MVC拥有自己的在RequestParameters上运行验证器的方式。

请参考以下链接以了解这种情况:

http:// stackoverflow。com /问题/ 6203740 / spring-web-mvc-validate-individual-request-params

http:// copyrightdev。棒极了com /发布/ 92560458673 /技巧提示与弹簧验证器一起玩

因此,为什么直接注释请求参数不起作用。 使它工作的方法是创建一个包装器类,并在该包装器类中注释我们的参数。 因此,您可以创建一个包装类,如下所示:

然后,您可以像下面这样在控制器中使用包装器:

现在,当您对预设参数进行验证失败时,Spring会抛出一个。 如果不处理,则直接将其作为响应发送出去。

要发送更清晰的响应,可以在控制器中创造一个方法。

这可能是这样的:

请注意,这种在控制器中验证请求参数的方法只是许多可行的方法之一。 只是我发现此方法在其他方法中更为方便和简洁。

您可以通过运行Web应用程序。 您可以检查获得以下URL时得到的响应:

由于我们正在实施重要的事情,因此最好通过单元测试来支持它。 我已经做到了,您将在GitHub的源代码中找到它。

我们测试过的是嵌入在常规数据中的SQL最常见的情况:

我们还测试了一些破坏SQL的数据,例如:

我们已经彻底验证了以下情况是否拒绝了这些恶意数据样本:

个人

带有前后和缀

所有CAPS

小写字母

我们应该让好的数据通过。 我们还通过良好的数据单元测试验证了这一点

您可以在GitHub上找到此示例项目。

网址:https:// github。com / rkpunjal / sql-safe-annotation-example

将其作为库/依赖关系直接包含到您的项目中。

我已经将其转换为一个开放源代码库,可以通过将其作为一个项目包含在您的项目中 依赖

包括在你的 将库添加为依赖项

到库的GitHub链接为:https:// github。com / rkpunjal / sql注入安全/

我相信这种方法非常有效,对我来说效果很好。

***我的免责声明是,在评估此解决方案是否对您有利之后,使用该风险自负。

我衷心希望这对您有所帮助。 请发表您的意见。

http:// stackoverflow。com /问题/ 6203740 / spring-web-mvc-validate-individual-request-params

http:// copyrightdev。棒极了com /发布/ 92560458673 /技巧提示与弹簧验证器一起玩

http:// codetutr。com / 2013/05/29 / custom-spring-mvc-validation-annotations /

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值