原理很简单,比较两个主机地址就OK了。下面的最详细的具体做法。
最近自己在学习JavaWeb入门。遇到了一个最简单的却又完全忽略的安全BUG,即我们目前的网页涉及到表单提交,所提交的目标地址是可以通过查看网页源代码看到的,这样子就可以实现在本地运行静态网页并向服务器提交数据的功能。也就是说,任何人都可以利用网页从外部登录网站,从而给网站留下严重过的安全隐患。为此,我们就需要解决这样一个问题:防止表单在网站外部提交。
首先,我们来写一个最简单的表单提交网页:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>普通的提交表单</title>
</head>
<body>
<center><form action="quanan.jsp" method="post" id="form">
<ul>
<li>用户名:<input type="text" name="name" value="admir" size="29"></li>
<li>密 码:<input type="text" name="psw" value="admir" size="29"></li>
<li><input type="submit" value="注册"><input type="reset" value="重置"></li>
</ul>
</form>
</center>
</body>
</html>
这里我们表单的提交目标地址是:
action="quanan.jsp"
显然这个就是我们平常的写法。
现在我们用非法的手段来访问这个地址。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>非法的提交表单</title>
</head>
<body>
<center>
<form action="http://192.168.191.1:8888/FirstProject/quanan.jsp" method="post" id="form">
<ul>
<li>用户名:<input type="text" name="name" size="29"></li>
<li>密 码:<input type="text" name="psw" size="29"></li>
<li><input type="submit" value="注册"><input type="reset" value="重置"></li>
</ul>
</form>
</center>
</body>
</html>
观察二者就是提交的目标地址不同:
action="http://192.168.191.1:8888/FirstProject/quanan.jsp"
(192.168.191.1为本机联网所在路由器的IP,通过命令行输入ipconfig查询得到)
这样我们就模拟出在外部提交表单的效果了。
现在我们需要考虑一下这个quanan.jsp的编写了。
其实很简单,我们只要用request.getHeader(“referrer”)来获取得到目标地址,然后通过URL urlOne=new URL(String url)的方法得到目标地址的URL,在通过urlOne.getHost();来得到其主机。
同样的道理,我们只需要通过request.getRequestURL().toString()方法获得当前网页的IE地址,然后在获得URL,最后是主机地址。
最后比较两个主机地址是否相同,就可以得出结论了~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.net.URL"%>
<%@page import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>防止表单在本机地址上被提交</title>
</head>
<%
//获取页面的请求地址
String strOne = request.getHeader("referer");
//用来存储请求页面的服务器主机
String pathOne = "";
//当请求页面的地址不为空时,获取主机
if(strOne != null){
URL urlOne = new URL(strOne);
pathOne = urlOne.getHost();
%><center><b><pre>页面请求的地址和其主机:<% out.println(strOne);%><% out.println(pathOne);%></pre></b></center><%
}
//获取当前页面的请求地址
String strTwo = request.getRequestURL().toString();
//用来存储当前页面的服务器主机
String pathTwo = "";
if(strTwo != null){
URL urlTwo = new URL(strTwo);
pathTwo = urlTwo.getHost();
%><center><b><pre>当前页面的服务器主机:<% out.println(strTwo);%><% out.println(pathTwo);%></pre></b></center><%
}
%>
<body>
<%
if (!pathOne.equals(pathTwo)) { //判断当前页面的主机与服务器的主机是否相同
%> <center><b>禁止网站外部提交表单!!! </b></center><%
}
else {
String name = request.getParameter("name");
String pass = request.getParameter("psw");
out.println("<center><b>");
out.println("用户名:" + name);
out.println("<br>");
out.println("密 码:" + pass);
out.println("</b></center>");
}
%>
</body>
</html>
查看输出结果就能比较分析了:我采用的是tomcat部署运行的,所以提交的目的地址的主机地址就为本机地址和我所连的路由器的主机地址当然不同,所以。。。
总共就三个页面:anquan.jsp,quanan.jsp,anquanTrue.jsp!代码都经过测试运行,初学者可以轻松尝试!(PS:有对JavaWeb感兴趣的求联系,一起交流学习QQ 651157519)
分享到:
相关推荐
9. **CSRF防护**:为了防止未经授权的第三方提交表单,可以生成并验证CSRF(跨站请求伪造)令牌。在表单中添加隐藏字段,服务器端验证令牌的有效性。 10. **提交后的重定向**:提交成功后,可以使用`header()`函数...
3. **表单提交验证**:为了确保用户输入的数据有效且安全,开发者会在前端进行表单验证。这可能使用JavaScript实现,通过对`onsubmit`事件的监听,当用户尝试提交表单时,验证函数会被调用。验证通常检查用户名是否...
`HTTP_Referer`(有时也拼写为`HTTP_REFERER`)是最常用来防止外部提交的一个HTTP头部字段。当用户点击一个链接或提交表单时,浏览器通常会将当前页面的URL放入请求头的`Referer`字段中发送给服务器。这样,服务器...
一种常见的方法是在表单提交后禁用提交按钮,或者设置一次性令牌(Token)。在ASP.NET中,可以通过`ViewState`或`Session`来存储一个唯一的标识,当用户第一次提交时验证该标识,如果已存在则拒绝再次提交。此外,还...
ChronoForms是Joomla CMS(内容管理系统)中的一个强大且灵活的表单构建工具,专为那些希望在网站上创建各种交互式表单的用户设计。这款插件以其易于使用和丰富的功能而受到广泛的欢迎,无论你是初级用户还是经验...
- 第二种是使用EM-SDK来弹出webview,这需要通过EM-SDK的接口来控制表单的打开以及返回/提交后的回调事件。 5. 后端请求区分终端 后端请求在区分终端时,可以通过_isMobile参数来判断请求是从移动端发起还是PC端...
在Web开发中,表单验证框架的实现是至关重要的,它确保了用户输入的数据符合预设的规则,防止无效或恶意的数据进入系统。本部分将深入讲解如何在B/S架构的应用程序中实施一个简单的表单验证框架,以登录表单为例。 ...
总结来说,"阿江表单邮件 v1.0"是一款高效、灵活的邮件发送解决方案,结合了网页表单的便利性和邮件服务的广泛覆盖,使得用户可以直接在网页上完成信息的提交和邮件的发送,从而简化了网站与用户的沟通流程。...
随着互联网技术的迅速发展,网站登录功能已成为用户与网站交互的基石。为确保用户在使用登录功能时的体验与安全,前端页面的表单验证显得尤为重要。本篇文章将深入探讨原生JavaScript(简称js)实现的简单登录表单...
在实际的表单验证过程中,当用户提交表单时,验证库的代码会运行,对表单中每个需要验证的输入元素进行校验。如果输入项没有通过验证,通常会有以下几种处理方式: 1. 浏览器会自动阻止表单的提交。 2. 通过脚本弹...
在本文中,我们将深入探讨如何使用jQuery来提交多个表单,这是在一些特定场景下,如数据批量处理或多步骤表单时可能会用到的功能。 首先,我们来看一下给出的代码片段: ```html $(function(){ $("#btnSubmit")...
原生JavaScript的表单校验则是为了确保用户输入的数据符合预期格式和规则,提高用户体验,防止无效或恶意数据的提交。这个经典小项目旨在通过JavaScript实现对HTML表单的验证,无需依赖外部库如jQuery或其他前端框架...
在ThinkPHP中,默认情况下,提交表单时会对数据进行自动转义,这是为了防止SQL注入攻击。自动转义涉及在单引号(')和双引号(")周围添加反斜杠(\)。例如,字符串 "hds"gh"j'g'h" 在ThinkPHP中会被自动转义为 "hds\"gh\...
当用户在网页上填写表单并提交时,数据首先会在客户端(用户的浏览器)进行验证。如果客户端验证通过,数据才会被发送到服务器。客户端验证可以减少不必要的服务器请求,提高用户体验,因为它可以即时反馈错误,而...
在提交表单时,可以使用`event.preventDefault()`防止页面刷新,并在`methods`中定义一个处理函数来处理提交逻辑。 6. **错误处理**:通过设置`v-bind:class`或`v-bind:style`,可以根据条件动态地切换类或样式,...
在这些文件中,我们可以看到表单元素如`<form>`、`<input>`、`<button>`等,它们用于收集用户输入并触发表单提交。 2. **CSS**(Cascading Style Sheets): 文件夹`css`内包含了样式表,可能包含`style.css`或其他...
在Web开发中,跨域提交数据是指用户在浏览器中通过表单提交,或者通过Ajax请求等方式,将数据发送到另外一个域下的服务器进行处理。这种行为在一些特定的应用场景中可能会造成安全隐患,比如跨站请求伪造(CSRF)...
在描述中提到,这个程序是使用PHP原生代码设计的,这意味着没有依赖任何外部框架或库。使用原生PHP编写的好处是,代码更加精简,运行效率高,同时也便于理解和维护,尤其是对于初学者来说,通过学习这样的代码可以更...
2. **数据验证**:对用户提交的数据进行验证,确保其符合业务规则,防止无效数据的输入。 3. **表单关联**:可以与工作流程中的任务节点关联,当任务到达时自动显示相应表单,完成数据填写后提交。 4. **动态表单*...
从代码就可以看出,我们只需在提交按钮上加入这一句: onclick=”[removed]{this.disabled=true;document.form1.submit();}”,意思是当按钮点击后,将按钮的不可用属性设置为true,这样按钮就变灰了 表单提交后...