sql语句注入
各位给想想办法,怎样并解决sql注入那. --------------------编程问答-------------------- 用PreparedStatement --------------------编程问答-------------------- 用 PreparedStatement 构建sql语句--------------------编程问答-------------------- 还有其他方法吗?
public boolean executeSql(String strSql, Object[] param) throws Exception {
boolean bRet = false;// 返回值
try {
if (conn == null) {
conn = getConn(connId);// 取得数据联接
}
ps = conn.prepareStatement(strSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
}
bRet = ps.execute();
System.out.println(strSql);
bRet = true;
} finally {
closeResource();
}
return bRet;
}
我们公司用的都是statement,
总不能全改吧,这样不现实,
我试过用filter过滤,但会出问题,
跪求其他方法! --------------------编程问答-------------------- 同2楼使有PreparedStatement 。
public void getConn(){
try {
Class.forName(Driver);
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public ResultSet execQuery(String sql,String[] params){
getConn();
try {
ps = conn.prepareStatement(sql);
if(params!=null&¶ms.length>0){
for(int i=0;i<params.length;i++){
ps.setString(i+1, params[i]);
}
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public int execUpdate(String sql,String[] params){
int count = 0;
getConn();
try {
ps = conn.prepareStatement(sql);
if(params!=null&¶ms.length>0){
for(int i=0;i<params.length;i++){
ps.setString(i+1, params[i]);
}
}
count = ps.executeUpdate();
} catch (SQLException e) {
System.err.println("SQLException: " + e.getMessage());
if (conn != null) {
System.err.println("Transaction is being rolled back");
try {
conn.rollback(); //数据库回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}finally{
closeAll();
}
return count;
}
public void closeAll(){
try {
if(rs!=null)
rs.close();
if(ps!=null)
ps.close();
if(conn!=null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} --------------------编程问答-------------------- 写方法,把所有特殊字符串和特殊情况尽可能的过滤掉 --------------------编程问答-------------------- 表示不是很懂。。。。 --------------------编程问答--------------------
长痛不如短痛,早点改吧。
并安排测试时间。 --------------------编程问答--------------------
的确是这样
statement效率低,而且不安全 --------------------编程问答--------------------
你们公司都用statement???敢问,你们是啥公司啊??
用JDBC,除非对效率非常注重的模块,都要用PreparedStatement的,好处很多 --------------------编程问答-------------------- 是的 现在都用PreparedStatement --------------------编程问答-------------------- 写个过滤器,过滤特殊字符 --------------------编程问答-------------------- StringBuffer hql = new StringBuffer(" from Service service where 1=1 ");
Map<Object, Object> map = new HashMap<Object, Object>();
if(searchService != null && searchService.length() != 0){
hql.append(" and service.a like :a ");
hql.append(" or service.aa like :aa ");
hql.append(" or service.aaa like :aaa ");
map.put("a", "%"+searchService+"%");
map.put("aa", "%"+searchService+"%");
map.put("aaa", "%"+searchService+"%");
}
}
hql.append(" order by service.id desc ");
List<Service> serviceList =
getHibernateTemplate().getSessionFactory().getCurrentSession()
.createQuery(hql.toString())
.setProperties(map)
.list(); --------------------编程问答-------------------- List<Service> serviceList =
getHibernateTemplate().getSessionFactory().getCurrentSession()
.createQuery(hql.toString())
.setProperties(map)
.setFirstResult(firstResult)
.setMaxResults(maxResult)
.list();
分页的。 --------------------编程问答-------------------- List<Service> serviceList =
getHibernateTemplate().getSessionFactory().getCurrentSession()
.createQuery(hql.toString())
.setProperties(map)
.setFirstResult(firstResult)
.setMaxResults(maxResult)
.list();
分页的。 --------------------编程问答-------------------- statement改为preparestatement,后者是前者的子类,全部改应该也很快的吧。
用filter,过滤特殊字符,特殊字符网上查就是了。 --------------------编程问答-------------------- 看来是非改不可了lz,而且在Java中防止sql注入最好的方法也是PreparedStatement了 --------------------编程问答--------------------
我公司是一家做外包的软件公司
--------------------编程问答-------------------- 赞同
补充:Java , Java EE