网页编程不过关,web攻击始终浮于表面。随着不断的学习,此博文也会不断更新。
本次学习在http://www.runoob.com/jsp/jsp-tutorial.html进行,关注编程中有关标点符号和闭合标签等的语法细节。
一、JSP基本知识
1.简介
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
2.
环境搭建:http://www.runoob.com/jsp/jsp-setup.html
Java EE和Tomcat的安装使用:http://www.runoob.com/jsp/eclipse-jsp.html
3.语法
(1)脚本程序
<% 代码片段 %>
如:通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行:<%@ include file="文件相对 url 地址" %>
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签:<%@ taglib uri="uri" prefix="prefixOfTag" %>
相关属性:
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
中文编码的设置:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
(2)声明
<%! declaration; [ declaration; ]+ ... %>
(3)JSP表达式
<%= 表达式 %>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
(4)注释
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
<\% | 代表静态 <%常量 |
%\> | 代表静态 %> 常量 |
\' | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |
注释语法常用在注入攻击,上传指令将后面的代码注释掉。
(5)指令
指令 | 描述 |
---|---|
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
(6)行为/动作元素
语法格式:
<jsp:action_name attribute="value" />
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源<jsp:include page="相对 URL 地址" flush="true" /> |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象:<jsp:forward page="相对 URL 地址" /> |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据<jsp:text>模板数据</jsp:text> |
(7)隐含对象
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例,request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。 |
response | HttpServletResponse类的实例,response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例,session对象用来跟踪在各个客户端请求间的会话。 |
application | ServletContext类的实例,与应用上下文有关,通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。 |
config | ServletConfig类的实例,config.getServletName();返回包含在<servlet-name>元素中的servlet名字,注意,<servlet-name>元素在 WEB-INF\web.xml 文件中定义。 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。 这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。 pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。 PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。 其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
(8)判断语句
<% if (day == 1 | day == 7) { %>
<p>今天是周末</p>
<% } else { %>
<p>今天不是周末</p>
<% } %>
<%
switch(day) {
case 0:
out.println("星期天");
break;
case 1:
out.println("星期一");
break;
case 2:
out.println("星期二");
break;
case 3:
out.println("星期三");
break;
case 4:
out.println("星期四");
break;
case 5:
out.println("星期五");
break;
default:
out.println("星期六");
}
%>
(9)循环语句
<%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
<font color="green" size="<%= fontSize %>">
菜鸟教程
</font><br />
<%}%>
<%while ( fontSize <= 3){ %>
<font color="green" size="<%= fontSize %>">
菜鸟教程
</font><br />
<%fontSize++;%>
<%}%>
类别 | 操作符 | 结合性 |
---|---|---|
后缀 | () [] . (点运算符) | 左到右 |
一元 | ++ - - ! ~ | 右到左 |
可乘性 | * / % | 左到右 |
可加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等/不等 | == != | 左到右 |
位与 | & | 左到右 |
位异或 | ^ | 左到右 |
位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
条件判断 | ?: | 右到左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
(10)字面量
- 布尔值(boolean):true 和 false;
- 整型(int):与 Java 中的一样;
- 浮点型(float):与 Java 中的一样;
- 字符串(string):以单引号或双引号开始和结束;
- Null:null。
4.客户端请求
http://www.runoob.com/jsp/jsp-client-request.html
5.服务器响应
http://www.runoob.com/jsp/jsp-server-response.html
6.HTTP 状态码
状态码 | 消息 | 描述 |
---|---|---|
100 | Continue | 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求 |
101 | Switching Protocols | 服务器交换机协议 |
200 | OK | 请求被确认 |
201 | Created | 请求时完整的,新的资源被创建 |
202 | Accepted | 请求被接受,但未处理完 |
203 | Non-authoritative Information | |
204 | No Content | |
205 | Reset Content | |
206 | Partial Content | |
300 | Multiple Choices | 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接 |
301 | Moved Permanently | 被请求的页面已经移动到了新的URL下 |
302 | Found | 被请求的页面暂时性地移动到了新的URL下 |
303 | See Other | 被请求的页面可以在一个不同的URL下找到 |
304 | Not Modified | |
305 | Use Proxy | |
306 | Unused | 已经不再使用此状态码,但状态码被保留 |
307 | Temporary Redirect | 被请求的页面暂时性地移动到了新的URL下 |
400 | Bad Request | 服务器无法识别请求 |
401 | Unauthorized | 被请求的页面需要用户名和密码 |
402 | Payment Required | 目前还不能使用此状态码 |
403 | Forbidden | 禁止访问所请求的页面 |
404 | Not Found | 服务器无法找到所请求的页面 |
405 | Method Not Allowed | 请求中所指定的方法不被允许 |
406 | Not Acceptable | 服务器只能创建一个客户端无法接受的响应 |
407 | Proxy Authentication Required | 在请求被服务前必须认证一个代理服务器 |
408 | Request Timeout | 请求时间超过了服务器所能等待的时间,连接被断开 |
409 | Conflict | 请求有矛盾的地方 |
410 | Gone | 被请求的页面不再可用 |
411 | Length Required | "Content-Length"没有被定义,服务器拒绝接受请求 |
412 | Precondition Failed | 请求的前提条件被服务器评估为false |
413 | Request Entity Too Large | 因为请求的实体太大,服务器拒绝接受请求 |
414 | Request-url Too Long | 服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息 |
415 | Unsupported Media Type | 服务器拒绝接受请求,因为媒体类型不被支持 |
417 | Expectation Failed | |
500 | Internal Server Error | 请求不完整,服务器遇见了出乎意料的状况 |
501 | Not Implemented | 请求不完整,服务器不提供所需要的功能 |
502 | Bad Gateway | 请求不完整,服务器从上游服务器接受了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启或关闭 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | 服务器不支持所指定的HTTP版本 |
7.表单处理
(1)GET 方法
GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔,是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
(2)POST方法
POST提交数据是不可见,可以传输敏感信息,JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
8.过滤器
http://www.runoob.com/jsp/jsp-writing-filters.html
9.Cookie 处理
Cookie通常在HTTP信息头中设置(虽然JavaScript能够直接在浏览器中设置cookie)。在JSP中,设置一个cookie需要发送如下的信息头给服务器。
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 设置cookie的域名,比如 runoob.com |
2 | public String getDomain() 获取cookie的域名,比如 runoob.com |
3 | public void setMaxAge(int expiry) 设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间 |
4 | public int getMaxAge() 获取cookie有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止 |
5 | public String getName() 返回 cookie的名称,名称创建后将不能被修改 |
6 | public void setValue(String newValue) 设置 cookie的值 |
7 | public String getValue() 获取cookie的值 |
8 | public void setPath(String uri) 设置cookie 的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录 |
9 | public String getPath() 获取cookie 的路径 |
10 | public void setSecure(boolean flag) 指明cookie是否要加密传输 |
11 | public void setComment(String purpose) 设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用 |
12 | public String getComment() 返回描述cookie目的的注释,若没有则返回null |
使用步骤:
创建cookie对象-> 设置有效期->将cookie发送至http响应头
10.Session
JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现:<%@ page session="false" %>
S.N. | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 返回session对象中与指定名称绑定的对象,如果不存在则返回null |
2 | public Enumeration getAttributeNames() 返回session对象中所有的对象名称 |
3 | public long getCreationTime() 返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起 |
4 | public String getId() 返回session对象的ID |
5 | public long getLastAccessedTime() 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 |
6 | public int getMaxInactiveInterval() 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开 |
7 | public void invalidate() 将session无效化,解绑任何与该session绑定的对象 |
8 | public boolean isNew() 返回是否为一个新的客户端,或者客户端是否拒绝加入session |
9 | public void removeAttribute(String name) 移除session中指定名称的对象 |
10 | public void setAttribute(String name, Object value) 使用指定的名称和值来产生一个对象并绑定到session中 |
11 | public void setMaxInactiveInterval(int interval) 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效 |
11.文件上传
http://www.runoob.com/jsp/jsp-file-uploading.html
创建文件上传表单时,表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。enctype 属性应该设置为 multipart/form-data。action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。
编写后台 Servlet,进行编译和运行。
12.日期处理
http://www.runoob.com/jsp/jsp-handling-date.html
13.页面重定向
http://www.runoob.com/jsp/jsp-page-redirect.html
14.点击量统计
http://www.runoob.com/jsp/jsp-hits-counter.html
15.自动刷新
http://www.runoob.com/jsp/jsp-auto-refresh.html
16.发送邮件
http://www.runoob.com/jsp/jsp-sending-email.html
17.标准标签库(JSTL)
http://www.runoob.com/jsp/jsp-jstl.html
18.连接数据库
使用jdbc连接Mysql,进行操作:
创建测试数据:
CREATE TABLE `websites` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL DEFAULT '' COMMENT '站点名称', `url` varchar(255) NOT NULL DEFAULT '', `alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名', `country` char(10) NOT NULL DEFAULT '' COMMENT '国家', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘宝', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鸟教程', 'http://www.runoob.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');SELECT操作:
<sql:query dataSource="${snapshot}" var="result"> SELECT * from websites; </sql:query> <h1>JSP 数据库实例 - 菜鸟教程</h1> <table border="1" width="100%"> <tr> <th>ID</th> <th>站点名</th> <th>站点地址</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.url}"/></td> </tr> </c:forEach> </table>INSERT操作:
<sql:update dataSource="${snapshot}" var="result"> INSERT INTO websites (name,url,alexa,country) VALUES ('菜鸟教程移动站', 'http://m.runoob.com', 5093, 'CN'); </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from websites; </sql:query> <h1>JSP 数据库实例 - 菜鸟教程</h1> <table border="1" width="100%"> <tr> <th>ID</th> <th>站点名</th> <th>站点地址</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.url}"/></td> </tr> </c:forEach> </table>DELETE操作:
<!-- 删除 ID 为 11 的数据 --> <sql:update dataSource="${snapshot}" var="count"> DELETE FROM websites WHERE Id = ? <sql:param value="${11}" /> </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from websites; </sql:query> <h1>JSP 数据库实例 - 菜鸟教程</h1> <table border="1" width="100%"> <tr> <th>ID</th> <th>站点名</th> <th>站点地址</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.url}"/></td> </tr> </c:forEach> </table>UPDATE操作:
<!-- 修改 ID 为 3 的名字:菜鸟教程改为 RUNOOB --> <c:set var="SiteId" value="3"/> <sql:update dataSource="${snapshot}" var="count"> UPDATE websites SET name = 'RUNOOB' WHERE Id = ? <sql:param value="${SiteId}" /> </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from websites; </sql:query> <h1>JSP 数据库实例 - 菜鸟教程</h1> <table border="1" width="100%"> <tr> <th>ID</th> <th>站点名</th> <th>站点地址</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.url}"/></td> </tr> </c:forEach> </table>
19.XML数据处理
使用JSP发送XML内容就和发送HTML内容一样。唯一的不同就是您需要把页面的context属性设置为text/xml。要设置context属性,使用<%@page % >命令:<%@ page contentType="text/xml" %>
在使用JSP处理XML之前,您需要将与XML 和XPath相关的两个库文件放在<Tomcat Installation Directory>\lib目录下:
- XercesImpl.jar:在这下载http://www.apache.org/dist/xerces/j/
- xalan.jar:在这下载http://archive.apache.org/dist/xml/xalan-j/
更多见:http://www.runoob.com/jsp/jsp-xml-data.html
20.JavaBean
http://www.runoob.com/jsp/jsp-javabean.html
21.自定义标签
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。
见:http://www.runoob.com/jsp/jsp-custom-tags.html
22.表达式语言
http://www.runoob.com/jsp/jsp-expression-language.html
23.异常处理
常见类型:
使用Exception对象:
- 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员无法预见的错误。举例来说,如果一个文件将要被打开,但是无法找到这个文件,则一个异常被抛出。这些异常不能再编译期被简单地忽略。
- 运行时异常:一个运行时异常可能已经被程序员避免,这种异常在编译期将会被忽略。
- 错误:错误不是异常,但问题是它超出了用户或者程序员的控制范围。错误通常会在代码中被忽略,这些错误都会在编译期被忽略。
序号 | 方法&描述 |
---|---|
1 | public String getMessage()返回异常的信息。这个信息在Throwable构造函数中被初始化 |
2 | public ThrowablegetCause()返回引起异常的原因,类型为Throwable对象 |
3 | public String toString()返回类名 |
4 | public void printStackTrace()将异常栈轨迹输出至System.err |
5 | public StackTraceElement [] getStackTrace()以栈轨迹元素数组的形式返回异常栈轨迹 |
6 | public ThrowablefillInStackTrace()使用当前栈轨迹填充Throwable对象 |
在错误页面中使用JSTL标签:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<table width="100%" border="1">
<tr valign="top">
<td width="40%"><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr>
<tr valign="top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>${pageContext.errorData.statusCode}</td>
</tr>
<tr valign="top">
<td><b>Stack trace:</b></td>
<td>
<c:forEach var="trace"
items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>
可以有更好的用户交互性:
使用 try…catch块:将异常处理放在一个页面中,并且对不同的异常进行不同的处理
<% try{ int i = 1; i = i / 0; out.println("The answer is " + i); } catch (Exception e){ out.println("An exception occurred: " + e.getMessage()); } %>
即直接调用java代码即可。
24.调试
http://www.runoob.com/jsp/jsp-debugging.html
25.国际化
http://www.runoob.com/jsp/jsp-internationalization.html
二、JSP常见漏洞
事实上,我突然意识到JSP语言本身提供了很多保障,是使用者本身不注意规范,随意复制粘贴,强行组合带来的麻烦。
常见的JSP漏洞有SQL注入漏洞、http响应分割漏洞等
SQL注入漏洞
SQL注入攻击是当今最危险、最普遍的基于Web的攻击之一。所谓注入攻击,是攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串中,如果要对一个网站进行SQL注入攻击,首先需要找到存在SQL注入漏洞的地方,也是寻找所谓的注入点。SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方。
最常用的寻找SQL注入点的方法,是在网站中寻找如下形式的页面链接:http://www.xxx.com/xxx.asp?id=YY,其中“YY”可能是数字,也有可能是字符串,分别被称为整数类型数据或者字符型数据。
页面中如果返回了类似的错误信息,说明该网站可能存在SQL注入攻击的漏洞。
具体的注入方法,请见博主关于sql注入的博客。
SQL注入漏洞攻击的防范方法有很多种,现阶段总结起来有以下方法:
(1)数据有效性校验。如果一个输入框只可能包括数字,那么要通过校验确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符,最好的方法是增加字符复杂度自动验证功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。另外限制表单数据输入和查询字符串输入的长度也是一个好方法。如果用户的登录名最多只有10个字符,那么不要认可表单中输入10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
(2)封装数据信息。对客户端提交的数据进行封装,不要将数据直接存入cookie中,方法就是在编程的代码中,插入session、if、try、else,这样可以有效地防止攻击者获取cookie中的重要信息。
(3)去除代码中的敏感信息。将在代码中存在的用户名、口令信息等敏感字段删除,替换成输入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:这样显然会暴露管理员的用户名、口令信息。可以将其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
这样就安全了很多,入侵者也是不会轻易的就获取到用户名、口令信息。
(4)替换或删除单引号。使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注入漏洞攻击,单引号时常会无法约束插入数据的Value,可能给予输入者不必要的权限。用双引号替换掉单引号可以使大部分SQL注入漏洞攻击失败。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
显然会得到与
“select * from users where username='admin' and password= '1234567'”
相同的结果。
(5)指定错误返回页面。攻击者有时从客户端尝试提交有害代码和攻击字符串,根据Web Service给出的错误提示信息来收集程序及服务器的信息,从而获取想得到的资料。应在Web Service中指定一个不包含任何信息的错误提示页面。
(6)限制SQL字符串连接的配置文件。使用SQL变量,因为变量不是可以执行的脚本,即在Web页面中将连接数据库的SQL字符串替换成指定的Value,然后将Web.config文件进行加密,拒绝访问。
(7)设置Web目录的访问权限。将虚拟站点的文件目录禁止游客用户(如:Guest用户等)访问,将User用户权限修改成只读权限,切勿将管理权限的用户添加到访问列表。
(8)最小服务原则。Web服务器应以最小权限进行配置,只提供Web服务,这样可以有效地阻止系统的危险命令,如ftp、cmd、vbscript等。
(9)鉴别信息加密存储。将保存在数据库users表中的用户名、口令信息以密文形式保存,也可以对users表进行加密处理,这样可以大大增加对鉴别信息访问的安全级别。
(10)用户权限分离。应尽可能的禁止或删除数据库中sa权限用户的访问,对不同的数据库划分不同的用户权限,这样不同的用户只能对授权给自己的数据库执行查询、插入、更新、删除操作,就可以防止不同用户对非授权的数据库进行访问。
http响应分割漏洞
HTTP响应头拆分攻击本质是:攻击者可以发送一个或几个HTTP指令迫使漏洞服务器产生一个攻击者构想好的输出。它可以让服务器误把几条HTTP请求看成一次完成的HTTP请求来解释。第一条请求也许攻击者部分控制着一部分,但这并不是危险的;危险的是,攻击者完全控制着第二条HTTP请求,即从HTTP状态行一直到HTTP请求的尾部。如果这样可行,攻击者就会发送多个请求指令到目标系统:第一条使得服务器完全接受两个HTTP响应,第二条响应通常是在服务器上请求一些非法资源,而服务器将会自动匹配到第二条响应,输出攻击者想要请求的资源,从而达到攻击者的目的。
衍生攻击:
1 跨站脚本攻击(XSS):这是一个非常普通和老式的漏洞,它可以让用户通过运行了一段javascript或者html代码后,可以截取该用户的cookie和session。但是到现在,通过一些重定向脚本发起一次XSS攻击是很困难的,尤其是当用户使用最新补丁的IE浏览器的时候,除非位置头是完全控制的。但是当结合HTTP响应头攻击确是可以非常简单实现,即使只是部分控制位置头。
2 web缓存中毒(我们称之为web损耗):这是一个新的攻击技术,攻击者强迫服务器高速缓存中记录了第二次HTTP请求,而服务器中的高速缓存记录的第二次请求是经过攻击者精心构造的。这将成功的对目标站点进行损耗,当其他人访问目标站点时,他们仅仅读取了高速缓存里的数据,造成站点被“黑”的假象。当然,除了站点损耗之外,攻击者也可以偷取用户的session和cookie。
3 通过对用户的攻击:这是第二种方式的一个特殊情况。它对单个用户的欺骗、对服务器单个页面的损耗,和暂时的磨损,也可以偷取到特定用户的session和cookie。
4 劫持具体用户的页面敏感信息:攻击者欺骗服务器,并取得敏感用户的权限,并进入其用户的状态,访问到一些秘密信息。
5 浏览器高速缓存中毒:这也是一项最新的攻击方式,它这和跨站脚本攻击方式有点类似,唯一的差别就是攻击者强迫浏览器高速缓存中记录一个长和持续的磨损的网页,直到浏览器的高速缓存已经清洁。
参考:https://zhidao.baidu.com/question/1367650806896322699.html?fr=iks&word=jsp+%C2%A9%B6%B4&ie=gbk
……
仍在学习中,加油!