to 2008scott()你的方案: 1.把sqlstr 例如:"select * from *** where ***=?" 放到一个bean里 2.把sqlstr的?参数 也放到这个bean里 3.然后用这个bean去操作数据库 是吗?那摸这个bean他到底做的是什么工作呢?
to Jomper(Jr.) 我理解的bean就是在前台JSP和数据库之间建立联系,使相关的变量得以传送。 如果把访问数据库的语句直接写在JSP里面,也可以,但这不符合分层的要求。表示-业务-数据库。这个层次是要分的。 另外,bean还可以帮助你得到JSP页面里面的任何参数。
to 2008scott() 可能是我把问题弄复杂了。 我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。 我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException... 我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错?
接上文: 当然如果直接用Statement来建立会话,"' or 1=1--"就成了万能密码,没有任何安全性可言了...
可以加参数,PreparedStatement更加灵活,而且速度比Statement要快
楼主说:认真的看下面的内容,然后给出可行性方案的得80分"可能是我把问题弄复杂了。 我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。 我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException... 我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错? "
prep = conn.prepareStatement("Select name from table where id=?", ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); prep.setInt(1, id); ResultSet rs = prep.executeQuery(); ...还是这个好至于你说的注入问题,我觉得应该先参数检查吧
thx ,但是我的另一个程序导致这个数据库连接程序必须使用ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY
这两个参数,至少TYPE_SCROLL_SENSITIVE是必须要用的。
现在换成了PerparedStatement后似乎只能直接读sqlstr...
prep.setInt(1, id);
ResultSet rs = prep.executeQuery();
...这样有什么问题啊,参数都是在SQLString中以?表示
一些jdbc驅動程序支持可更新的ResultSet對象,即吮許程序使用ResultSet接口的方法插入,更新和刪除紀錄
prep = conn.prepareStatement(sqlstr,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = prep.executeQuery();
我把这个bean放在用户登陆里面做测试,结果输入校验结果是对的,但是如果用户密码是"' or 1=1--"
的话页面就会抛出NullPointerException,这又是什么原因呢?
應該是你寫法有問題吧.
prepareStatement參數都用"?"
然後用SetXXX();
然后,可以通过函数调用的时候传参过来,更改?的值。
不管怎么样,你每次访问数据库的时候,sql里面要插的值是一定的,你就在jsp页面中得到那个值,然后传到一个javabean中。然后这个javabean去访问数据库操作的bean(把参数的值也带过去)。这样就可以实现读取数据库了。然后这个javabean又可以把调用的结果返回到jsp的页面中。这个方法应该是可行的。
1.把sqlstr 例如:"select * from *** where ***=?" 放到一个bean里
2.把sqlstr的?参数 也放到这个bean里
3.然后用这个bean去操作数据库
是吗?那摸这个bean他到底做的是什么工作呢?
如果把访问数据库的语句直接写在JSP里面,也可以,但这不符合分层的要求。表示-业务-数据库。这个层次是要分的。
另外,bean还可以帮助你得到JSP页面里面的任何参数。
我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。
我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException...
我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错?
当然如果直接用Statement来建立会话,"' or 1=1--"就成了万能密码,没有任何安全性可言了...
我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。
我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException...
我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错?
"
prep.setInt(1, id);
ResultSet rs = prep.executeQuery();
...还是这个好至于你说的注入问题,我觉得应该先参数检查吧
不知道大项目是怎么做的,求解!
参数数组 Object[] obj = new Object[] { "ljh", new Long(123),new Integer(3)};public static ResultSet getResultSet(Connection connection, String sqlStr,
Object[] objArr)
{
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(sqlStr);
for (int i = 1; i <= objArr.length; i++) {
Object obj=objArr[i - 1];
ps.setObject(i, objArr[i - 1]);
}
return ps.executeQuery();
} catch (SQLException ex)
{
LjhLogger.debug("getResultSet(prepareStatement):SQL["+sqlStr+"]",ex);
return null;
} finally {
ps=null;
}
}