SpringBoot数据JPA存储库对SQL注入安全吗



我有一个Springboot应用程序,它使用SpringDataJPA模块进行数据库操作。当我们扫描代码时,checkmarx报告了很多高&中等评级的问题w.r.t SQL_注入攻击。以下是其中一个用例,我需要帮助是否将问题标记为假阳性。如果不是假阳性,我应该怎么做才能解决这个问题。?

AppController.Java

@Controller
public class AppController
{
private static final Logger logger = LoggerFactory.getLogger(AppController.class);
@Autowired
private AppService appService;

@RequestMapping(value = "/propertiesHistory", method = RequestMethod.POST)
public String getPropertiesHistory(@ModelAttribute("propSearchForm") @Validated PropertiesSearch propertiesSearch, BindingResult result, Model model, final RedirectAttributes redirectAttributes)
{
String instanceName = propertiesSearch.getInstanceName();

if (!propertiesSearch.getInstanceName().equalsIgnoreCase("NONE"))
{
List<String> propVersionDates = appService.getPropertyHistoryDates(instanceName);
//Some Businees Logic
}
if (result.hasErrors())
{
logger.warn("getPropertiesHistory() : Binding error - " + result.getAllErrors());
}
else
{
//Some Businees Logic
}
return "app/prophist";
}
}

AppService.java

@Service
public class AppService
{
private static final Logger logger = LoggerFactory.getLogger(AppService.class);

@Autowired
private AppRepository appRepository;

public List<String> getPropertyHistoryDates(String instanceName)
{
List<String> list = new ArrayList<String>();
try
{
list = appRepository.findAllMDateDESCByProNotEmptyAndInstanceName(instanceName);
}
catch (Exception e)
{
logger.error("getPropertyHistoryDates(): Error while fetching data from database - ", e);
}

return list;
}
}

AppRepository.java

public interface AppRepository extends JpaRepository<AppDataEntity, Long>
{
@Query(value="SELECT mdate FROM tablexyz WHERE properties IS NOT NULL AND instanceName =:instanceName ORDER BY mdate DESC",nativeQuery=true)
List<String> findAllMDateDESCByProNotEmptyAndInstanceName(@Param("instanceName") String instanceName);
}

我在存储库中也有一些方法,如List<AppDataEntity> findAllByInstanceName(String instanceName);,它使用Proxy类实现,但不使用本机查询。在这种情况下,我也会得到这个Checkmarx问题-SQL_Inpjection

我读到Spring Data并没有按照这里接受的答案改变Hibernate处理实体的方式。这是真的,适用于@Query(value="some query",nativeQuery=true)吗。?

SpringBoot Data JPA Repository可以安全地抵御SQL_Inpression攻击,只要我们在@Query(JPQL(或@Query(nativeQuery(中有命名或索引/位置参数即可

是的,对于下面的问题。它适用于@Query((。唯一的条件是查询应该具有命名(:paramname(或位置(?1(参数。

我读到Spring Data不会根据此处接受的答案改变Hibernate与实体的工作方式。它是真实的和适用的吗对于@Query(value="some Query",nativeQuery=true(。?

以下是针对sql注入的SAFE。

@Query(value="SELECT mdate FROM tablexyz WHERE properties IS NOT NULL AND instanceName =:instanceName ORDER BY mdate DESC",nativeQuery=true)
List<String> findAllMDateDESCByProNotEmptyAndInstanceName(@Param("instanceName") String instanceName);

原因很简单,SpringDataJPA在后台使用hibernate,而hibernate又使用PreparedStatements的方式来处理数据库。

关于PreparedStatements方式如何保护我们的应用程序免受SQL_Inpression攻击的详细解释,可以在这里和这里找到

只要使用占位符(:instanceName(而不是带有附加参数的自定义SQL,SQL就不会受到SQL注入的攻击。

很可能您将在Spring Data JPA接口下使用Hibernate实现,因此在使用PreparedStatement时要小心。

我有在我以前编码的一些存储库上运行Checkmarx的经验,当涉及到RESTAPI中的SQL注入和XSS时,它会给出很多误报。原因是它看不到项目中使用的上下文或库。

它为我们报告了许多SQL注入漏洞,尽管我们使用了大量使用PreparedStatement的Spring JDBC模板。

最新更新