首頁 > web前端 > js教程 > Ajax請求與Filter解析

Ajax請求與Filter解析

php中世界最好的语言
發布: 2018-04-03 09:53:15
原創
1371 人瀏覽過

这次给大家带来Ajax请求与Filter解析,Ajax请求与Filter解析的注意事项有哪些,下面就是实战案例,一起来看一下。

案例引入

现在有这样一个问题,就是在提交大片文字评论的时候,前台拿到数据之后给后台发送ajax请求,然后后台有一个防止SQL注入的Filter,这个Filter得到这个前台传过来的数据之后,进行合法性校验,如果没有校验成功,那么要跳转到error.jsp页面进行显示错误信息。现在让我们看看怎么实现这个需求。

思路一:请求转发实现

ajax请求

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

$.ajax({

method:'post',

url:'servlet/DemoServlet',

dataType:'json',

data:{

'userName':userName,

'passWord':passWord,

'text': text

},

success:function(data){

//成功之后的逻辑

},

error:function(){

//错误之后的逻辑

}

});

登入後複製

防止SQL注入Filter

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

package com.yiyexiaoyuan.filter;

import java.io.IOException;

import java.util.Enumeration;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

//过滤sql关键字的Filter 

public class SQLFilter implements Filter

{

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException

{

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

// 获得所有请求参数名

Enumeration params = req.getParameterNames();

String sql = "";

while (params.hasMoreElements())

{

// 得到参数名

String name = params.nextElement().toString();

// System.out.println("name===========================" + name +

// "--");

// 得到参数对应值

String[] value = req.getParameterValues(name);

for (int i = 0; i < value.length; i++)

{

sql = sql + value[i];

}

}

System.out.println("提交方式:"+req.getMethod());

System.out.println("被匹配字符串:" + sql);

if (sqlValidate(sql))

{

//请求转发

req.getRequestDispatcher("error.jsp").

forward(req, res);

}

else

{

String request_uri = req.getRequestURI();

chain.doFilter(request, response);

}

}

// 校验

protected static boolean sqlValidate(String str)

{

str = str.toLowerCase();// 统一转为小写

// String badStr = "and|exec";

String badStr = "&#39;|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";

/*

* String badStr =

* "&#39;|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"

* +

* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"

* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";

*/// 过滤掉的sql关键字,可以手动添加

String[] badStrs = badStr.split("\\|");

for (int i = 0; i < badStrs.length; i++)

{

if (str.indexOf(badStrs[i]) != -1)

{

System.out.println("匹配到:" + badStrs[i]);

return true;

}

}

return false;

}

public void init(FilterConfig filterConfig) throws ServletException

{

// throw new UnsupportedOperationException("Not supported yet.");

}

public void destroy()

{

// throw new UnsupportedOperationException("Not supported yet.");

}

}

登入後複製

web.xml配置

1

2

3

4

5

6

7

8

9

10

<filter>

<display-name>SQLFilter</display-name>

<filter-name>SQLFilter</filter-name>

<filter-class>com.yiyexiaoyuan.filter.SQLFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>SQLFilter</filter-name>

<url-pattern>/servlet/*</url-pattern>

</filter-mapping>

<filter>

登入後複製

分析,ajax请求DemoServlet,然后请求先被防止SQL注入这个Filter过滤器先过滤,然后过滤到的请求参数构成一个匹配字符串,然后检查是否是恶意代码,如果是的话,请求转发。但是很遗憾,逻辑上这个是对的,但是ajax请求是局部刷新的,最后是要回到ajax请求发起的这个页面的,所以请求转发不会实现,我们看下一种实现逻辑。

思路二:返回值进行判断

这个思路的逻辑是这样的:在Filter过滤掉信息的时候,给ajax请求回送一个json数据,然后返回给前台,前台拿这个数据进行判断是否是恶意代码和良好代码。再进行下一步的处理。

ajax请求

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

$.ajax({

method:'post',

url:'servlet/DemoServlet',

dataType:'json',

data:{

'userName':userName,

'passWord':passWord,

'text': text

},

success:function(data){

//成功之后的逻辑

if (data.mssage!=""){

//执行处理恶意代码的逻辑

}

else{

}

},

error:function(){

//错误之后的逻辑

}

});

登入後複製

防止SQL注入的Filter

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

package com.yiyexiaoyuan.filter;

import java.io.IOException;

import java.util.Enumeration;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

//过滤sql关键字的Filter 

public class SQLFilter implements Filter

{

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException

{

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

// 获得所有请求参数名

Enumeration params = req.getParameterNames();

String sql = "";

while (params.hasMoreElements())

{

// 得到参数名

String name = params.nextElement().toString();

// System.out.println("name===========================" + name +

// "--");

// 得到参数对应值

String[] value = req.getParameterValues(name);

for (int i = 0; i < value.length; i++)

{

sql = sql + value[i];

}

}

System.out.println("提交方式:"+req.getMethod());

System.out.println("被匹配字符串:" + sql);

if (sqlValidate(sql))

{

//传送json数据

JSONObject json = new JSONObject();

json.accumulate("message", "恶意代码注入");

res.getWriter().print(json.toString());

}

else

{

String request_uri = req.getRequestURI();

chain.doFilter(request, response);

}

}

// 校验

protected static boolean sqlValidate(String str)

{

str = str.toLowerCase();// 统一转为小写

// String badStr = "and|exec";

String badStr = "&#39;|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";

/*

* String badStr =

* "&#39;|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"

* +

* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"

* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";

*/// 过滤掉的sql关键字,可以手动添加

String[] badStrs = badStr.split("\\|");

for (int i = 0; i < badStrs.length; i++)

{

if (str.indexOf(badStrs[i]) != -1)

{

System.out.println("匹配到:" + badStrs[i]);

return true;

}

}

return false;

}

public void init(FilterConfig filterConfig) throws ServletException

{

// throw new UnsupportedOperationException("Not supported yet.");

}

public void destroy()

{

// throw new UnsupportedOperationException("Not supported yet.");

}

}

登入後複製

思路三:异常+跳转实现

这个思路的逻辑是这样的。后台的Filter过滤掉恶意注入代码的话,抛出RuntimeException(),然后导致ajax请求失败,然后回调ajax请求的error方法。但是我们错误页面的数据怎么传送过去呢?经过我认真思考之后,我们可以这样做,在session存一个error_messgae值,然后ajax请求的error方法跳转到错误页面,然后进行取值渲染错误页面。

ajax请求

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

$.ajax({

method:&#39;post&#39;,

url:&#39;servlet/DemoServlet&#39;,

dataType:&#39;json&#39;,

data:{

&#39;userName&#39;:userName,

&#39;passWord&#39;:passWord,

&#39;text&#39;: text

},

success:function(data){

//成功之后的逻辑

},

error:function(){

window.location.href="error.jsp";

}

});

登入後複製

防止SQL注入Filter

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

package com.yiyexiaoyuan.filter;

import java.io.IOException;

import java.util.Enumeration;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

//过滤sql关键字的Filter

public class SQLFilter implements Filter

{

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException

{

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

// 获得所有请求参数名

Enumeration params = req.getParameterNames();

String sql = "";

while (params.hasMoreElements())

{

// 得到参数名

String name = params.nextElement().toString();

// System.out.println("name===========================" + name +

// "--");

// 得到参数对应值

String[] value = req.getParameterValues(name);

for (int i = 0; i < value.length; i++)

{

sql = sql + value[i];

}

}

System.out.println("提交方式:"+req.getMethod());

System.out.println("被匹配字符串:" + sql);

if (sqlValidate(sql))

{

req.getSession().setAttribute("error_message","恶意注入了");

throw new RuntimeException("恶意注入");

}

else

{

String request_uri = req.getRequestURI();

chain.doFilter(request, response);

}

}

// 校验

protected static boolean sqlValidate(String str)

{

str = str.toLowerCase();// 统一转为小写

// String badStr = "and|exec";

String badStr = "&#39;|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";

/*

* String badStr =

* "&#39;|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"

* +

* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"

* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";

*/// 过滤掉的sql关键字,可以手动添加

String[] badStrs = badStr.split("\\|");

for (int i = 0; i < badStrs.length; i++)

{

if (str.indexOf(badStrs[i]) != -1)

{

System.out.println("匹配到:" + badStrs[i]);

return true;

}

}

return false;

}

public void init(FilterConfig filterConfig) throws ServletException

{

// throw new UnsupportedOperationException("Not supported yet.");

}

public void destroy()

{

// throw new UnsupportedOperationException("Not supported yet.");

}

}

登入後複製

error.jsp实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base href="<%=basePath%>">

<title>错误页面</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0"

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

</head>

<body>

<center> 

系统出错了,请稍后再试......

<br />

<br />

<br />

<br />

错误信息是: ${ error_message}

</center> 

</body>

</html>

登入後複製

这样就很巧妙得实现了Filter拦截并友好提示。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

ajax跨域访问报错501怎么处理

ajax操作图层遮挡页面

以上是Ajax請求與Filter解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板