用java编写防止SQL注入!求java高手指点!问题解决后,一定提高悬赏!
我从网上下载了一下代码!当我抄入我的程序是数据库一直抛出空指针!publicclassSQLFilterimplementsFilter{privateStringinj...
我从网上下载了一下代码!当我抄入我的程序是数据库一直抛出空指针!
public class SQLFilter implements Filter
{
private String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,";
protected FilterConfig filterConfig = null;
/*Should a character encoding specified by the client be ignored? */
protected boolean ignore = true;
public void destroy(){}
public void init(FilterConfig config) throws ServletException
{
this.filterConfig = config;
this.inj_str = filterConfig.getInitParameter("keywords");
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res= (HttpServletResponse)response;
Iterator values = req.getParameterMap().values().iterator();//获取所有的表单参数
while(values.hasNext())
{
String[] value = (String[])values.next();
for(int i = 0;i < value.length;i++)
{
if(sql_inj(value[i]))
{
//TODO这里发现sql注入代码的业务逻辑代码
return;
}
}
}
chain.doFilter(request, response); //他的作用是将请求转发给过滤器链上下一个对象
}
public boolean sql_inj(String str)
{
String[] inj_stra=inj_str.split("\\|"); //split() 方法用于把一个字符串分割成字符串数组
for(int i=0 ; i < inj_stra.length ; i++ )
{
if(str.indexOf(" "+inj_stra[i]+" ")>=0) //输入的信息与inj_str所定义的元素进相比较, =>0表示已经注入的SQL语句
{
return true;
}
}
return false;
}
}
错误信息
java.lang.NullPointerException
security.SQLFilter.sql_inj(SQLFilter.java:52)
security.SQLFilter.doFilter(SQLFilter.java:41)
我输入了value的值,全都是乱码!求解!在线等!
我现在需要验证的是管理员的登陆,内容有编码与密码! 展开
public class SQLFilter implements Filter
{
private String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,";
protected FilterConfig filterConfig = null;
/*Should a character encoding specified by the client be ignored? */
protected boolean ignore = true;
public void destroy(){}
public void init(FilterConfig config) throws ServletException
{
this.filterConfig = config;
this.inj_str = filterConfig.getInitParameter("keywords");
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res= (HttpServletResponse)response;
Iterator values = req.getParameterMap().values().iterator();//获取所有的表单参数
while(values.hasNext())
{
String[] value = (String[])values.next();
for(int i = 0;i < value.length;i++)
{
if(sql_inj(value[i]))
{
//TODO这里发现sql注入代码的业务逻辑代码
return;
}
}
}
chain.doFilter(request, response); //他的作用是将请求转发给过滤器链上下一个对象
}
public boolean sql_inj(String str)
{
String[] inj_stra=inj_str.split("\\|"); //split() 方法用于把一个字符串分割成字符串数组
for(int i=0 ; i < inj_stra.length ; i++ )
{
if(str.indexOf(" "+inj_stra[i]+" ")>=0) //输入的信息与inj_str所定义的元素进相比较, =>0表示已经注入的SQL语句
{
return true;
}
}
return false;
}
}
错误信息
java.lang.NullPointerException
security.SQLFilter.sql_inj(SQLFilter.java:52)
security.SQLFilter.doFilter(SQLFilter.java:41)
我输入了value的值,全都是乱码!求解!在线等!
我现在需要验证的是管理员的登陆,内容有编码与密码! 展开
展开全部
SQL注入无非就是把对单引号和双"-"进行转换。
最好不要拼装SQL语句,以使用参数化的sql或者直接使用存储过程进行数据查询存取。
最好不要拼装SQL语句,以使用参数化的sql或者直接使用存储过程进行数据查询存取。
更多追问追答
追问
我就是那样做得!我现在就是想多掌握一点东西!在网上查一下,想试一下!我改了很长时间!还是空!您受累帮我看看!我会提高悬赏的!拜托了!
追答
52行是哪一行啊。。。。
if(str.indexOf(" "+inj_stra[i]+" ")>=0) //输入的信息与inj_str所定义的元素进相比较, =>0表示已经注入的SQL语句
这句是不是有问题啊
你试试写成if(str.indexOf(inj_stra[i])>=0)
我测了一下改正这样过滤方法就OK了
还是不行你先根据错误提示找到是哪一行报错,然后控制台打出来相关信息看对不对~~~试试看调试~~~~
展开全部
你拆分字符串的时候, 不加\\ 只要| 试试. 还有,建议,不要把符号也写在字符里, 这个容易出问题. 再看看你的xml编码. 是不是支持中文
追问
照您的方法改了一下!还是不行!
还是报错:
security.SQLFilter.sql_inj(SQLFilter.java:46)
security.SQLFilter.doFilter(SQLFilter.java:35)
对应我程序的代码是:
if(sql_inj(value[i]));
String[] inj_stra=inj_str.split("\\|"); //split() 方法用于把一个字符串分割成字符串数组
您受累再帮我看看一下!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询