如我原来的form是
文件路径是怎么防止别人做一个html文件提交到我的aaa.jsp呢?如:
那么请问 我怎么在我的aaa.do里面 判断对方发送这个表单的域名呢?
主要是怎么得到?
我用request.getRemoteHost() 只得到了 对方的IP
求一方法得到对方提交表单时的域名。
谢谢 急用啊
[b]问题补充:[/b]
谢谢 我是用struts2做的程序
不过token好像能防重复提交form
但是还是不能防止 别人跨域提交啊
我写form用了token 别人模拟的时候也能用啊
[b]问题补充:[/b]
我token 用的确实不太明白
摆脱那个大哥 给个 例子
form 怎么写
action中怎么写
config要配什么啊
在网上找了半天 都写的很模糊
public static boolean validate(HttpServletRequest request){
String Referer="";
boolean referer_sign=true; //true 站内提交,验证通过 //false 站外提交,验证失败
Enumeration headerValues = request.getHeaders("Referer");
while (headerValues.hasMoreElements())
Referer =(String)headerValues.nextElement();
//判断是否存在请求页面
if(Referer==null || Referer.length() referer_sign=false;
else
{
//判断请求页面和getRequestURI是否相同
String servername_str=request.getServerName();
if(servername_str!=null || servername_str.length()>0)
{
int index=0;
if (StringUtils.indexOf(Referer, "https://")==0){
index=8;
}
else if (StringUtils.indexOf(Referer, "http://")==0){
index=7;
}
if(Referer.length()-index<servername_str.length()) //长度不够
referer_sign=false;
else
{ //比较字符串(主机名称)是否相同
String referer_str=Referer.substring(index,index+servername_str.length());
if(!servername_str.equalsIgnoreCase(referer_str))
referer_sign=false;
}
}
else
referer_sign=false;
}
return referer_sign;
}
如果你用struts框架的话,那么就可以使用struts的令牌机制struts1和struts2都有,且很简单。
如果你没有用框架,那么你自己在写jsp表单的时候多写个input,type=hidden,生成随机数做为它的值,并将随机数保存在session中。如果客户端请求中有该属性,并且值一样的话那么就可以证明这个请求是用服务器页面发来的,因为自己写的html是没有办法知道这个随机数的。记得比对后就将session中的令牌清掉。struts的令牌机制和这个是一个道理。
这样不仅能防止非法连接,还能防止重复刷新等恶意攻击
加一个token(同时存在session和页面),然后判断这个token是不是一致。我感觉你的思路不太可行。
靠,我和楼上的同时写,但是楼上兄比我早一点点提交。要知道有人解答我就不管了。
[color=red]求一方法得到对方提交表单时的域名[/color]
别说域名了,你连IP都得不到
request.getRemoteHost()得到的是请求此页面的IP,也就是浏览器使用者的IP,并非你说的另一个服务器的IP
你就用1楼的方法实现吧
token生成的时候会把一个随即字符串放到session,你在aaa.do 把传过来的token值和session里的比一下就知道是不是你那里传来的了.
好好看看第一条回复,搞清楚token的机制,其实和验证码的道理是一样的,如果验证码你能够任意破解的话,那么token就没有意义了。但到目前为止好像没听到什么东西能够事先知道验证码的。
你要是怀疑token的能力,你自己实验下,看看你的的表单能不能被提交
里面加配置文件
/login.jsp
/exception.jsp
还可以在上面的程序里面加上一些例外:
比如你允许那些能站外提交
配置楼上的兄弟正解
给你讲下session吧,一个用户在同一个会话中只存在一个session。session由服务器生成管理,每次请求和响应都有传送session的id,这样就可以判断是不是同一个用户。你自己写的html来发送请求是没有session的id这个东东的,没有session就取不到token保存在session中的随机数。
token是在每当有客户端请求带有token标签的jsp时,服务器会在用户的session中保存了一个随机的字符,然后写入jsp隐藏的表单域,这一却都是在服务器完成的,客户端是无法预知的。那么只有当客户端来请求我们服务器的这个jsp时才会有这个随机字符串,才会有这个隐藏表单域,客服端填写完表后将随机数一并提交到服务器,服务器拿到表单数据后,首先比较token的值是否和session中的值一致,如果一致则将session中的随机数清掉,如果不一致证明表单不是第一次提交或者这个表单不是合法的表单,而是你自己写的html。
最后说下,session可以证明你的身份,证明你是合法的和服务器在交流。而token可以证明你是第一次提交表单,这两个都有了,你的表单应该是安全的
以上是我个人的理解啊,挣你的分好累~
如果你用struts框架的话,那么就可以使用struts的令牌机制struts1和struts2都有,且很简单。
如果你没有用框架,那么你自己在写jsp表单的时候多写个input,type=hidden,生成随机数做为它的值,并将随机数保存在session中。如果客户端请求中有该属性,并且值一样的话那么就可以证明这个请求是用服务器页面发来的,因为自己写的html是没有办法知道这个随机数的。记得比对后就将session中的令牌清掉。struts的令牌机制和这个是一个道理。
你说的放到Session里面,如果人家需要第二次提交,但是Session里面又有值怎么办啊?
html是没有办法知道这个随机数的。记得比对后就将session中的令牌清掉。struts的令牌机制和这个是一个道理。
这个很简单的,在项目中经常要考虑这种问题,例如,没有登陆就访问一些登录以后才能显示的页面,这个需要过滤器filter来搞定的,给你一个例子,例如,提交表单肯定是要登陆吧?登录了肯定有UserSession,下面给你个例子,就是如果用户没登陆,就不让他访问/user目录下的页面
package com.yunfei.filter;
import java.io.IOException;
import java.util.List;
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 javax.servlet.http.HttpSession;
import com.yunfei.pojo.User;
import com.yunfei.pojo.UserList;
public class UserSessionFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String currentURL = req.getRequestURI(); // 取得根目录所对应的绝对路径:
String targetURL = currentURL.substring(currentURL.indexOf("/", 1),
currentURL.length()); // 截取到当前文件名用于比较
//System.out.println(targetURL);
HttpSession session = req.getSession();
User u = (User) session.getAttribute("UserSession");
//System.out.println("u1111111111111111111==" + session.getId());
if (u != null) {
chain.doFilter(request, response);
} else {
//System.out.println("----");
req.getRequestDispatcher("/login.html").forward(req, res);
return;
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml中添加如下配置
UserSessionFilter
com.yunfei.filter.UserSessionFilter
UserSessionFilter
/user/*
根本不需要考虑域名的,你只要在他登陆时加入一个UserSession,然后,在加入一个filter,在他提交表单时,先经过filter,如果UserSession为空,就跳到登陆页面,如果UserSession不为空,则让他提交表单
你说的这种情况,
怎么防止别人做一个html文件提交到我的aaa.jsp呢?如:
只需要把Action的name多加一个/check
如:
chat.jsp
index.jsp
然后,在UserSession filter的web。xml文件中配置的时候
/check/*
就行,关于session过滤器,网上有很多例子,你自己找找看吧,很简单的