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");
}

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

  1. 解决在ubuntu的firefox浏览器下不能看b站视频的问题

    1.打开终端: 2.输入如下指令: sudo apt-get install ubuntu-restricted-extras 3.会弹出一个类似软件安装的界面,点击Tab使光标指到"安装& ...

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

    解决IE.firefox浏览器下JS的new Date()的值为Invalid Date.NaN-NaN的问题 参考文章: (1)解决IE.firefox浏览器下JS的new Date()的值为Inv ...

  3. firebug可以在非firefox浏览器下使用

    firebug可以在非firefox浏览器下使用,但是效果当然不如firefox下好使用,但是也可以解决一些ie9以下版本不好调试的弊病 使用方法:在需要调试的页面上加: <script typ ...

  4. 火狐浏览器表单不跳转_表单button的outline在firefox浏览器下的问题

    outline的使用,大家都喜欢在reset样式表中直接重置: 复制代码代码如下: * { outline: none; } Eric Meyers 在他的CSS Reset 是这样重置的: 复制代码 ...

  5. ctf:Firefox浏览器下安装一些常用的插件

    一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: l  在Windows和Linux上安装VirtualBox l  创建一个Kali Linux虚拟机 l  更新和升级Ka ...

  6. 怎么从edge/chrome/firefox浏览器打开FTP链接!

    怎么从edge/chrome/firefox浏览器打开FTP链接! 前一阵子配置了ftp服务器,因为在校园网下传输文件很方便,而且速度很快,但是发现在edge/chrome/firefox上打不开(没 ...

  7. 最新版Chrome/Firefox浏览器下载地址

    安装前需卸载原有的版本 [推荐使用,兼容性最好] Chrome浏览器:选择适合你电脑的格式点击下载  Chrome72.0 Win64 http://static.nowcoder.com/b/i/g ...

  8. Google Chrome 11 浏览器 下Flash Debug 插件无效的解决办法

    谷歌浏览器 用起来 就一个字 爽 所以 本人在开发Flex的时候也希望能用chrome来调试自己的flex程序,但是发现无法连接Debug插件,下面总结可能出现问题的地方: 1.首先你要确定是否安装了 ...

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

    - 转自:http://xinghao.me/2016/03/01/2016-03-01-kill-hao123/ 首先检查了一下chrome的主页设置,发现没有问题,依然是原来的google.com ...

最新文章

  1. 利用Unity3D制作简易2D计算器
  2. 关于Linux中文件权限的探究
  3. 在线网上打字系统_在线网上打字比赛软件_打字练习_中英文打字系统
  4. adnroid开发环境的搭建
  5. 关于tomcat Post 数据参数的问题
  6. 自动化日志收集及分析在支付宝 App 内的演进
  7. 攻击者利用的Windows命令、横向渗透工具分析结果列表
  8. S5PV210体系结构与接口02:ARM编程模型 汇编指令
  9. 知乎热问:一个程序员的水平能差到什么程度?
  10. 凌云一周看点 | 混合云多Region架构;云上用户定制化网络;边缘云全站加速;什么是操作系统的云原生...
  11. JavaScript视频系统教程
  12. 系统分析与设计期末复习题目
  13. 王道——数据结构 第一章 思维拓展
  14. python:烤地瓜程序
  15. 什么是邓氏编码DUNS NUMBER?
  16. 课题:shell脚本安装httpd
  17. jquery easyui中文培训文档
  18. 如何才能做好网站seo
  19. torchtorchvision对应版本
  20. java实现下载网络图片到本地

热门文章

  1. win10图标变白纸_超详细的纯净版win10安装教程,手把手教你学会,小白秒变大神!...
  2. 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
  3. HTML鼠标悬停图片置顶,jquery实现鼠标悬浮停止轮播特效
  4. dev 报表设计器 怎么设置每页10行_可嵌入您系统的.NET 报表控件ActiveReports:带状列表组件...
  5. Linux先发送条件变量,浅谈Linux条件变量的使用
  6. 前端HTML5CSS3基础知识点
  7. linux 不能发送邮件可能的原因
  8. 一对多 多对一 多对多 多条语句只出现一条的问题
  9. pytorch打印模型参数_Pytorch网络压缩系列教程一:Prune你的模型
  10. Nginx学习笔记---ngx_table_elt_t数据结构