struts-config.xml的配置以及过滤用户所有输入

struts-config.xml的配置笔记
/文 空虚浪子心

code:



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

<data-sources >
//数据源,好处是封装数据库连接.
<data-source key="ds">//数据源名称,用于.getServletContext().getAttribute("ds");获取后设置连接.
<set-property property="password" value="" />
<set-property property="minCount" value="2" />
<set-property property="maxCount" value="4" />
<set-property property="user" value="sa" />
<set-property property="driverClass" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />

<set-property property="description" value="hahahahahahhahahahah" />
<set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs" />
<set-property property="readOnly" value="false" />
<set-property property="autoCommit" value="true" />
<set-property property="loginTimeout" value="10" />
</data-source>

</data-sources>

<form-beans >
//ActionForm(接受用户请求数据然后封装成BEAN)声明部分
//每一个ActionForm都应该在此声明 <form-bean …………………………………………………… />
<form-bean name="checkForm" type="com.xaccp.form.CheckForm" />

</form-beans>

<global-exceptions />
<global-forwards >
//全局的”线“,用于多个action都可以调用
<forward name="error" path="/error.jsp"></forward>
</global-forwards>

//action的映射配置。
<action-mappings >

<action path="/check" type="com.xaccp.action.CheckAction" attribute="checkForm" name="checkForm" scope="request">
//name,attribute,scope三个属性是在已经配置了一个ActionForm以后使用
//默认只有 path,type;
//path:路径
//type:类名
//name:ActionForm对应的名字。
//attribute:放入session/(request)里的名称。
//scope:request或session,推荐使用reqeust。

//forward是“线”,就是一个类似于“射线”的东西。调用了mapping.findForward("ok");就会转向ok.jsp页面。
//这个线在一个action范围内.
<forward name="ok" path="/ok.jsp"></forward>

<forward name="fail" path="/index1.jsp"></forward>
</action>
<action path="/index" type="com.xaccp.action.IndexAction">
//没有actionform对应的。
<forward name="index" path="/index1.jsp"></forward>
</action>

</action-mappings>

<controller processorClass="com.xaccp.util.Checkreqeust">
//RequestProcessor[align=center] [/align],相当于过滤器,只能过滤用户请求.不能过滤response.
//多数用于设置Encode.
//可以用于过滤SQL注入;参见Checkreqeust.java.方法processPreprocess必须返回true,否则会返回一个空白页面.

</controller>

<message-resources parameter="com.xaccp.ApplicationResources" />

<plug-in className="com.xaccp.util.Init">
//插件的作用:进行初始化工作.在这里用于getConnection()
</plug-in>
</struts-config>


——————————-Checkreqeust.java—————————————–

code:



//作者:空虚浪子心
//必须在XML里设置了controller 才可以用.
//<controller processorClass="com.xaccp.util.Checkreqeust"></controller>
//防止SQL注入必须使用域处理执行SQL语句,这里只能判断后记录.
package com.xaccp.util;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.RequestProcessor;

public class Checkreqeust extends RequestProcessor {

@Override
protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {

try {
request.setCharacterEncoding("UTF-8"); //设置中文显示
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

ArrayList arr=new ArrayList(); //可变数组,因为参数个数未知.

Enumeration en = request.getParameterNames(); //枚举,获取所有参数的名称.

if (en==null)
{
return true;
}

String strname

while(en.hasMoreElements())
{ //遍历枚举,然后获取参数中对应的值
strname=request.getParameter((String)en.nextElement());
arr.add(strname);
}

HttpSession session=request.getSession();
for (int i = 0; i < arr.size(); i++)
{
String str=(String)arr.get(i);

if (checkSqlIn(str)==false)
{
session.setAttribute("errr", "sql注入!ip"+request.getLocalAddr()+"记录在案!");//检测到了注入,就记录到SESSION里,这里为了测试,也可以有其他方式.
}
}

return true;
}

private boolean checkSqlIn(String strName)
{ //判断,可能写的不全,但是有这个意思就好.
strName=strName.toLowerCase();
if (strName.indexOf("select") > -1 || strName.indexOf("insert") > -1 || strName.indexOf("execute") > -1 || strName.indexOf(";") > -1 || strName.indexOf("–") > -1 || strName.indexOf("’") > -1 || strName.indexOf("\"") > -1 || strName.indexOf("delete") > -1 )
{
return false;
}
return true;
}
}


这种方式可以有效的防止站点下所有的提交数据中的内容(除非你用jsp处理业务),
主要用于防止注入,脏话过滤等.

发表评论?

1 条评论。

发表评论