java - 足够安全吗?

标签 java sql spring

这样的insert语句足够安全吗?我是否必须检查它是否不可 SQL 注入(inject)?

@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();
}

最佳答案

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

PreparedStatement 将直接在指定字段中写入 String 的内容,转义任何不需要的值。

不过,请注意,如果您的查询设计不好,您将很容易受到 SQL 注入(inject)攻击。例如,如果您创建查询但手动附加 String:

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

更多信息:

<小时/>

看起来您也在使用 Hibernate,所以最好保存实体。这将是类似的,但需要处理/维护的代码更少。

关于java - 足够安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23792680/

相关文章:

MySQL 条件 ASC/DESC

mysql - sql创建函数中的语法错误

java - spring 上下文中的可选附加属性文件

java - java web服务使用什么方法?

java - 当满足特定条件时,是否可以在 Java Stream 中使用谓词?

java - 从接口(interface)转换到实现类的性能开销

java - Confluence - 访问 Comala 工作流的 Activity 流

sql - 有效地使用另一个表的聚合更新表

java - Constructor.newInstance 中的自定义类加载器

java - 如何在 Felix 中使用 Derby 客户端?