当前位置:编程学习 > JAVA >>

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();
}
} --------------------编程问答-------------------- 写方法,把所有特殊字符串和特殊情况尽可能的过滤掉 --------------------编程问答-------------------- 表示不是很懂。。。。 --------------------编程问答--------------------
引用 3 楼  的回复:
还有其他方法吗?
我们公司用的都是statement,
总不能全改吧,这样不现实,
我试过用filter过滤,但会出问题,

跪求其他方法!

长痛不如短痛,早点改吧。
并安排测试时间。 --------------------编程问答--------------------
引用 7 楼  的回复:
引用 3 楼 的回复:

还有其他方法吗?
我们公司用的都是statement,
总不能全改吧,这样不现实,
我试过用filter过滤,但会出问题,

跪求其他方法!

长痛不如短痛,早点改吧。
并安排测试时间。

的确是这样
statement效率低,而且不安全 --------------------编程问答--------------------
引用 3 楼  的回复:
还有其他方法吗?
我们公司用的都是statement,
总不能全改吧,这样不现实,
我试过用filter过滤,但会出问题,

跪求其他方法!

你们公司都用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了 --------------------编程问答--------------------
引用 9 楼  的回复:
引用 3 楼  的回复:

还有其他方法吗?
我们公司用的都是statement,
总不能全改吧,这样不现实,
我试过用filter过滤,但会出问题,

跪求其他方法!

你们公司都用statement???敢问,你们是啥公司啊??
用JDBC,除非对效率非常注重的模块,都要用PreparedStatement的,好处很多



我公司是一家做外包的软件公司

--------------------编程问答-------------------- 赞同
引用 15 楼  的回复:
statement改为preparestatement,后者是前者的子类,全部改应该也很快的吧。
用filter,过滤特殊字符,特殊字符网上查就是了。
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,