session和cookie

做网页时遇到的问题,当一个form表单提交时,如果是站内的提交就有效,如果是其它站盗用的form就无效。
例(这是某站的登陆页面):
<body>
    <form action="/checkAction.do?page=success&fpage=error&method=check" method="POST">
用户名:<input type="text"><br>
密码:<input type="password"><
<input type="submit">
</form>
</body>

如果不做任何处理,那我自己在桌面上建个网页,也能提交上去,如:
<body>
    <form action="http://www.XXX.XXX/checkAction.do?page=success&fpage=error&method=check" method="POST">
用户名:<input type="text"><br>
密码:<input type="password"><
<input type="submit">
</form>
</body>
只需把网站实际地址写全就行了(红色部分),如果想防这种外部提交,java里如何做到??

--------------------------------------

4楼的这里:

還有一點:
就是除非別人知道你的struts-config.xml這個文件的所有配置。要不然在你的Actionmapping中是找不到Actionforward的。



楼主说加上了<form action="http://www.XXX.XXX/checkAction.do?的

html中form提交都是在浏览器端完成,你给出/checkAction.do,浏览器就会自动加上前面部分,最终都是submit到http://www.XXX.XXX/checkAction.do,结果无论如何都是一样的,貌似和Actionmapping无关,Actionmapping是请求来了以后服务器端做的事情。


另外4楼说的方法

httpservletreaeust.getsession(false)


这样要有效的前提是你前一个页面(就是form所在页面)有用session,而且session是浏览器关闭即失效的类型,而且模仿者不使用类似MYIE的外壳浏览器情况下

如果模仿者是使用MYIE,那么他先访问一次form所在的页面,生成session,然后再打开自己copy下来的html页面,提交form到服务器,这个时候

httpservletreaeust.getsession(false)

一样会取得到session的

不相信的可以试验一下,看来大家对session和cookie的关系还是搞得不太清楚,session的应用里面也有一个重要的部分sessionid保存在cookie里面(不支持cookie而用url传的就不说了。。。)
所以服务器端和浏览器端对cookie的处理都很大程度影响到session的行为,很多session的问题都由此而起。

---------------------------------------

试试就知道了,get出来一定是一样的,一样的submit到同一个地址。。。能不一样吗。。。

其实这个外部提交是没有方法避免的,因为你的form页面最终都是以HTML形式传送到客户端,所以copy一份相同的HTML一定可以做到提交

防止外部提交主要是防止使用程序多次提交吧,比如别人写一个程序来不断提交,这种情况就要用到一个验证码了,大家平时去论坛不是整天可以看到数字的验证码要输入吗,那个东西就是可以防止程序提交的。

---------------------------------


大哥﹐
     你真的對session理解清楚嗎﹖浏览器關了session是浏览器关闭即失效的类型嗎﹖
那我想請問
1:你知session是存活在那里嗎?
2:若你能正確的回答上面的問題那請你回答﹕是什么來決定session的生命長短的?


另﹕
   要清楚的是cookie是session的一個具體的實現。就session本身來說是與cookie沒有關系的若技朮發展的那一天可以不用cookie來實現session的話到那時我想就沒有人會將這兩個概念混在一起了!




session是保存在服务器端没错,但是要知道哪个用户是使用什么session,通过http协议这么知道的呢?

举个例子,服务器是resin,sessionid格式是使用cookie,session失效期是30分钟,这些可以通过服务器配置文件resin.conf设置:
<session-config>
        <session-max>4096</session-max>
        <session-timeout>30</session-timeout>
        <enable-cookies>true</enable-cookies>
        <cookie-domain>yourdomain</cookie-domain>
        <enable-url-rewriting>true</enable-url-rewriting>
</session-config>

进去一个使用session的jsp页面,检查response头,发现:
Set-Cookie: JSESSIONID=b5a86TcEnktd; domain=yourdomain; path=/
第一次访问的时候jsp发现这个请求没带有JSESSIONID,所以生产一个,并且set进去浏览器的cookie里面

然后第二次访问这个页面(不关闭浏览器)浏览器发现有这个cookie,对应这个domain和path,ok,
请求头包括这一行:
Cookie:  JSESSIONID=b5a86TcEnktd
服务器通过这个JSESSIONID到session池里面拿session,如果拿到,证明是有效的session(因为命名随机,所以很难撞),如果没有这个session,就证明sessionid无效,生成一个新的session,然后想上面一样set进cookie

此时关闭浏览器,再打开,访问同样的页面,由于浏览器发现刚才那个cookie已经过期(存活期是浏览器期限),所以请求头并没有加上Cookie:  JSESSIONID=b5a86TcEnktd这一行,服务器解释这个请求,找不到JSESSIONID,自然帮他生产一个新的,然后又通过response设置成Set-Cookie。
Set-Cookie: JSESSIONID=adqOWayWfard; domain=yourdomain; path=/

好了,这个cookie的id是adqOWayWfard,原来的那个是b5a86TcEnktd,服务器并不知道b5a86TcEnktd已经没有人使用了,所以它还是会存活到30分钟后才消失,但是此时如果有请求是使用了b5a86TcEnktd的JSESSIONID,服务器会认为是有效请求,此时的session就已经被别人盗用了~当然这种可能性很低。

但是楼主说的情况,是外部提交的问题,用session是解决不了的!
只要你访问过一次需要提交的页面,生成可提交的session,记录sessionid,然后在30分钟内,你可以用这个session提交,你可以用程序set入去http请求里面,也可以用url代session方式:
http://yourdomain/test.jsp;jsessionid=b5a86TcEnktd
服务器一样可以拿到session。
当然你可以在session里面设置一个值,比如时间,没session和间隔太短的都不许提交,这样可能有效一点,呵呵,但是httpservletreaeust.getsession(false)这个东西是没有用di,只要有sessionid就能让他get出东西出来,哈哈。

记住,http协议能让人提交,就不能防止别人用同样的http协议提交,因为http协议是没有验证和数据持续的东西的,所有东西都是通过request header、body来传送,只要我能写程序,分析你的http响应,然后做到和平常人的提交一模一样,你是没有办法禁止的,就算使用了图片验证码,我也可以取得图片来分析,得出验证码提交,这就是为什么现在图片验证码要很多干扰线、gif动态,为的就是防止ocr分析,只是数字的ocr识别率是很高的,也很容易做(用java,做过一个),所以我们要干扰干扰干扰~~~~
----------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值