解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题

SWFUpload是一个非常不错的异步上传组件,但是在Chrome、Firefox等浏览器下使用的时候会有问题。问题如下:为了防止跳过上传页面直 接向“接受SWFUpload上传的一般处理程序”(假如是Upload.ashx)发送请求造成WebShell漏洞,我的系统中对于 Upload.ashx进行了权限控制,只有登录用户才能进行上传。在IE下没问题,但是在Chrome下运行报错“用户未登录”。

经过搜索得知:因为SWFUpload是靠Flash进行上传的,Flash在IE下会把当前页面的Cookie发到Upload.ashx,但是Chrome、Firefox下则不会把当前页面的Cookie发到Upload.ashx。因为Session是靠Cookie中保存的SessionId实现的,这样由于当前页面的Cookie不会传递给Flash请求的Upload.ashx,因此请求的文件发送到Upload.ashx就是一个新的Session了,当然这个Session就是没有登录的了。

解决这个问题的思路也很简单,那就是手动把SessionId传递给服务器,再服务器端读出SessionId再加载Session。其实解决问题的办法 SWFUpload的Demo中已经给出了,那就是在SWFUpload的构造函数中设置post_params参数:

swfu = new SWFUpload({

post_params: {

"ASPSESSID": "<%=Session.SessionID %>"

}

post_params中设定的键值对将会以Form表单的形式传递到Upload.ashx,也就是SWFUpload提供了为请求增加自定义请求参数的接口。

上面的代码把当前页面的SessionId写到ASPSESSID值中,当用户上传文件后,ASPSESSID就会传递到服务器上了,在Global.asax的Application_BeginRequest中添加如下代码:

var Request = HttpContext.Current.Request;

var Response = HttpContext.Current.Response;

try

{

string session_param_name = "ASPSESSID";

string session_cookie_name = "ASP.NET_SESSIONID";

if (HttpContext.Current.Request.Form[session_param_name] != null)

{

UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]);

}

else if (HttpContext.Current.Request.QueryString[session_param_name] != null)

{

UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]);

}

}

catch (Exception)

{

Response.StatusCode = 500;

Response.Write("Error Initializing Session");

}

其中UpdateCookie方法的定义如下:

static void UpdateCookie(string cookie_name, string cookie_value)

{

HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);

if (cookie == null)

{

cookie = new HttpCookie(cookie_name);

//SWFUpload 的Demo中给的代码有问题,需要加上cookie.Expires 设置才可以

cookie.Expires = DateTime.Now.AddYears(1);

HttpContext.Current.Request.Cookies.Add(cookie);

}

cookie.Value = cookie_value;

HttpContext.Current.Request.Cookies.Set(cookie);

}

原理:当用户请求到达ASP.Net引擎的时候Application_BeginRequest方法首先被调用,在方法中看客户端是否提交上来了ASPSESSID,如果有的话则把ASPSESSID的值写入Cookie(以"ASP.NET_SESSIONID"为Key,因为ASP.Net中SessionId就是保存在"ASP.NET_SESSIONID"为Key的Cookie中的),Application_BeginRequest方法后就可以从Cookie中读取到"ASP.NET_SESSIONID"的值还原出页面的Session了。

如果网站中还用到了Membership的FormsAuthentication验证,则还需要把AUTHID也按照SessionID的方法进行处理,这一点是其他讲到SWFUpload这个Bug处理的文章中没有提到的。

在SWFUpload的构造函数中设置post_params参数:

swfu = new SWFUpload({

upload_url: "/AdminHT/UploadArticleImg.ashx",

post_params: {

"ASPSESSID": "<%=Session.SessionID %>",

"AUTHID" : "<%=Request.Cookies[FormsAuthentication.FormsCookieName].Value%>"

},

在在Global.asax的Application_BeginRequest中添加如下代码:

try

{

string auth_param_name = "AUTHID";

string auth_cookie_name = FormsAuthentication.FormsCookieName;

if (HttpContext.Current.Request.Form[auth_param_name] != null)

{

UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]);

}

else if (HttpContext.Current.Request.QueryString[auth_param_name] != null)

{

UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]);

}

}

catch (Exception)

{

Response.StatusCode = 500;

Response.Write("Error Initializing Forms Authentication");

}

时间: 2024-12-20 21:34:36

解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题的相关文章

解决ubuntu中firefox浏览器总是提示找不到服务器的问题

这个情况在我机器上经常出现,而且时不时的给你出点问题,但是有些时候等一下就好了,或者把引擎换到百度的话它就又行得通了.. 被这个问题搞得很烦,上网查了下说是防火墙啊之类的出问题,但是自己弄了后这个问题还是经常出现,不过好好查了下资料还是发现了问题所在,感觉这脑袋真的挺笨的.. 如果在ping其他主机,本地地址等一些地址后都没问题的话,那应该就是dns域名解析出了问题了. 查看dns域名解析配置文件: $cat /etc/resolv.conf 比如我的是这个信息: # Dynamic resol

解决IE、firefox浏览器下JS的new Date()的值为Invalid Date的问题

当我们需要将一串日期字符串转换为具体的Date格式的时候,往往需要用到new Date("xxxx")方法. 当时在IE浏览器下,会遇到这种问题: new Date('2016-01-01 00:00:00') //却返回这个值Invalid Date,转换失败 但是这个方法却在谷歌浏览器上可以返回正确的结果. 解决方式:最终发现是字符串的格式不被某些浏览器失败,而导致的. new Date('2016/01/01 00:00:00') //这下就转换正确了Wed Jan 1 00:0

Selenium加载Chrome/Firefox浏览器配置文件

Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://version/,查看个人资料路径并复制路径 2.加载配置数据 加载的用户配置路径后面的Default不需要,不然还是打开一个新用户. 在执行脚本时,确保没有谷歌浏览器打开,不然会报selenium.common.exceptions.WebDriverException: Message: unkn

【转】Selenium 加载Chrome/Firefox浏览器配置文件

原文地址:https://www.cnblogs.com/eastonliu/p/9083982.html Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://version/,查看个人资料路径并复制路径 2.加载配置数据 加载的用户配置路径后面的Default不需要,不然还是打开一个新用户. 在执行脚本时,确保没有谷歌浏览器打开,不然会报seleni

jquery中ajax在firefox浏览器下“object XMLDocument”返回结果的解决办法

asp.net中借助jquery的ajax处理功能,使用起来很方便.但是在firefox下获得的data报错object XMLDocument.这是因为默认的情况下把datatype用html来解析了,所以只要设置一下datatype就可轻松解决了. $.ajax({ type: "get", cache: false, url: "/bubuko_checkLogin.aspx", data: "", dataType: "text

解决hao123胁持chrome等浏览器主页问题

- 转自:http://xinghao.me/2016/03/01/2016-03-01-kill-hao123/ 首先检查了一下chrome的主页设置,发现没有问题,依然是原来的google.com. 然后到chrome的安装目录,直接双击打开chrome程序,没有问题. 然后检查快捷方式.因为我把chrome固定到任务栏上,一般使用的时候都是点击任务栏图标的,而实际上这只是一个快捷方式.右键任务栏chrome图标->右键Google Chrome->属性,就会弹出该快捷方式的属性窗口.发现

解决网站在负载均衡环境下SESSION丢失的问题

在WEB场中,动态网页往往会因为几台主机做了负载而产生SESSION丢失的问题,网上也有很多的介绍,我这里只将我经历的过程给大家分享一下: 系统要运行在负载平衡的 Web 场环境中,而系统配置文件web.config中的Session状态却设置为InProc(即在本地存储会话状态),导至在用户访问量大时,Session常经超时的情况.引起这个现象的原因主要是因为用户通过负载平衡IP来访问WEB应用系统,某段时候在某台服务器保存了Session 的会话状态,但在其它的WEB前端服务器中却没有保存S

转-firefox浏览器下margin-top不起作用的原因和对策

"collapsing margins"(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之间不能有非空内容. padding区域.border边框或使用清除分离方法)结合表示为一个单独的margin. 在css2.1中,水平的margin不会被折叠. 垂直margin可能在一些盒模型中被折叠: 1.在常规文档流中,2个或以上的块级盒模型相邻的垂直margin会被折叠. 最终的margin值计算方法如下: a.全部都为正值,取最大者:

css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题

最近在负责一个微信H5 App项目,遇到一个郁闷的问题,手机浏览器查看网页时图标都是模糊的,有锯齿,电脑浏览器显示则是正常.大概知道是分辨率适配等类型的问题,后来网上查找了一些办法,大部分的解决方案都是设计一套放大1倍的图标,再压缩显示. 我们都知道<img>标签可以通过固定宽高的方式来压缩大图,从而得到高清的显示效果,而图标一般用背景图来呈现,怎么搞呢?好吧,css3出了一个很牛逼的属性background-size可以直接设置背景图的宽高,直接解决了前者的疑惑. 那么问题来了,我们的网页不