在线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 /