它足够安全吗?

时间:2014-05-21 19:59:22

标签: java sql spring

这样的insert声明是否足够安全?我是否必须检查它是否不是SQL可注入的?

@Autowired
private SessionFactory sessionFactory;

public void add(String title, String region, String def, String rangeStart,
        String rangeEnd, Date extradition, Date expiration) {
    Session session = null;

    session = this.sessionFactory.getCurrentSession();
    Query query = session
            .createSQLQuery(
                    "INSERT INTO operators VALUES(NULL,:title,:region,:def,:rangeStart,:rangeEnd, :extradition, :expiration )")
            .setString("title", title).setString("region", region)
            .setString("def", def).setString("rangeStart", rangeStart)
            .setString("rangeEnd", rangeEnd)
            .setDate("extradition", extradition)
            .setDate("expiration", expiration);
    int updated = query.executeUpdate();
}

1 个答案:

答案 0 :(得分:3)

是的,对SQL注入攻击来说足够安全。请注意,Query#executeUpdate将在后台使用PreparedStatement为您设置参数的数据,这使得此语句足够安全。

PreparedStatement会直接在指定字段中写入String内容,从而避免任何不需要的值。

但请注意,如果您的查询设计不正确,您将接受SQL注入攻击。例如,如果您创建查询但手动附加String

String sqlOpenToSqlInjection = "FROM operators WHERE stringField = " + stringVariable;
Query query = session.createSQLQuery(sqlOpenToSqlInjection);
//code to execute query...

更多信息:


看起来你也在使用Hibernate,所以如果保存实体会更好。这类似但处理/维护的代码较少。