java:
PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();
如果我的存储例程位于mysql中,那么未过滤字符串有可能向我的代码注入某些内容吗?
no,因为PreparedStatement
是为了保护SQL Injection
的构建。
我看到您在调用存储过程,所以最好使用CallableStatement
。
String SQL = "{CALL myStoredRoutine(?, ?, ?)}";
CallableStatement cstmt = myConnection.prepareCall(SQL);
- 准备的语句
准备准备的实例包含已经编译的SQL语句。这就是使声明"准备"
的原因由于预先编译准备的对象,因此它们的执行速度可以比语句对象更快。
准备好的语句用于执行SQL查询
- callable语句
CallableStatement对象为所有RDBMS提供了一种以标准方式调用存储过程的方法。存储过程存储在数据库中;对存储过程的调用是CollableStatement对象所包含的内容。
不,这是不可能的。字符串是由准备好的语句过滤的。实际上,这是他们的观点之一。
no。参数绑定的目的是将参数解析为参数。那也很适合性能。
当您使用参数化查询时,如果不可能,将参数解析并使用逃生字符转换。这就是使用参数化查询/准备的语句的优势。