这样的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/