gpt4 book ai didi

java - 如何在不使用prepareStatement的情况下避免JasperReports中的sql注入(inject)

转载 作者:行者123 更新时间:2023-12-02 09:18:19 25 4
gpt4 key购买 nike

我有一个使用 JasperReports 5.5.0 打印报告的程序。该报告工作完美,但是当我在程序中考虑 sql 注入(inject)时,我可以使用prepareStatement 修复它。我的问题是当我使用 JRDesignQuery 编写查询时,因为它会创建 SQL 注入(inject)。

我被困在代码 jasper 报告中,看起来像这样

try{
JasperDesign jasperDesign = JRXmlLoader.load(PathSystem.getPath("rpt","report.jrxml"));
String sql = "SELECT * FROM Users WHERE UserId = '" + txtUser.getText() + "'";
JRDesignQuery newQuery = new JRDesignQuery();
newQuery.setText(sql);
jasperDesign.setQuery(newQuery);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,null, conn);
JasperViewer.viewReport(jasperPrint,false);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e);
}

我可以使用不带引号的输入“'或1='1”来使用sql注入(inject)。sql如下所示:

SELECT * FROM Users WHERE UserId = '' or 1='1' 

报表可以打印所有UserId。

我做了研究来解决这个问题,并找到了使用prepareStatement避免sql注入(inject)的方法。

这是使用prepareStatement的代码:

try {
JasperDesign jasperDesign = JRXmlLoader.load(PathSystem.getPath("rpt","report.jrxml"));
pst = conn.prepareStatement("SELECT * FROM Users WHERE UserId = ?");
pst.setString(1, txtUser.getText());
JRDesignQuery newQuery = new JRDesignQuery();
newQuery.setText(pst.toString().split("\\:")[1]);
jasperDesign.setQuery(newQuery);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,null, conn);
JasperViewer.viewReport(jasperPrint,false);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e);
}

我想知道是否有更好的方法来避免sql注入(inject)而不使用prepareStatement。

最佳答案

我不明白你避免使用prepareStatement的原因,它是最好的解决方案!

也就是说,如果您想避免sql注入(inject)(不使用prepareStatement),您应该运行验证并清理txtUser.getText()

例如:

  1. 使用字符串替换“清理”引号中的输入 - 您可以用双引号替换它或简单地转义它!
  2. 如果您知道输入应包含整数,trim()并验证它是否是一个数字(您可以通过不同的方式来实现: Integer.valueOf() ,使用正则表达式等)。

关于java - 如何在不使用prepareStatement的情况下避免JasperReports中的sql注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com