有管理系统A位于192.168.8.3服务器上,要把系统B(位于192.168.8.201)添加到A的菜单中(A有此功能,可以设置菜单链接地址,参数).
B以传入的USERID判断用户身份.http://192.168.8.201/b/default.aspx?USERID=XXXXX此时我想到如果用户直接在地址栏中输入地址,则只要知道管理员的USERID就可以以管理员的身份操作.于是乎使用了下面的句子:
if (Request.ServerVariables["HTTP_REFERER"] == null)
{
Response.Write("非法进入");
Response.End();
}后来在测试中发现了如下的结果:
1. 手动在地址栏中输入则提示非法进入.
2. 先登陆上A中,从A的菜单中打开B,右击,找到B的地址,复制,粘贴到现在见面的地址栏中.没有提示非法进入.请教Request.ServerVariables["HTTP_REFERER"]是怎么工作的?谢谢大家了.

解决方案 »

  1.   

    HTTP_REFERER参数只是一个HttpRequest.ServerVariables中IIS列表的一个设置而已.当你没有点这个连接URL的时候,不论怎么输入都会为空.但是一旦让IIS知道你点过以后变量就会存在列表中,所以就不为空了,,不会提示非法进入.
    这个设置与你需要的功能不一样.你可以手动设置window.open()中的参数为不可见.可以解决你的问题.但是并不能从根本上解决...所以你的问题最好是通过sever.transfer或session解决.
      

  2.   

    Request.ServerVariables["HTTP_REFERER"]中文解释如下:
    -------------------------------------------------------------------------返回一个字符串包含该网页的网址中提到的要求,以目前的网页使用的HTML <a>标记。请注意,该网址是一个使用者输入到浏览器地址栏中,这可能不包括名称预设文件。 如果网页是自由的, http_referer是空的。 http_referer是不是一个强制性的成员的HTTP规范。
      

  3.   

    2. 先登陆上A中,从A的菜单中打开B,右击,找到B的地址,复制,粘贴到现在见面的地址栏中.没有提示非法进入. 发现这种情况虽然能进入,但只能以自己的用户进入.如果修改USERID,那么还是会提示非法进入.系统用户的电脑水平并不是非常高,我想做到这一点基本也能满足我的要求了.不过还是希望有完善的解决方案.
      

  4.   

    因为在同一个浏览器中A打开着 你把A关掉后再打开B呢?
      

  5.   

    就是了 因为你在同一个浏览器中还保存着A的URL,就算你再新建打开它还是能够找到他上一页的url,所以就不会提示非法了
      

  6.   

    在我的测试中,如果在A中打开B,在B中右击复制网址,直接粘贴到地址栏上,则可以进入(但是是自己的用户);如果修改USERID,那么还是过不去.所以基本符合我的要求.不过感觉不是太爽,觉得不够安全.可以先使用这种方式,再有时间再找更好的方案.
      

  7.   

    我已经说过了,可以用window.open()隐藏url
    OnClientClick = "window.open('B.aspx?USERID=XXXXX','_blank','top=84,left=112,width=800,height=600,menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes')";
      

  8.   

    为什么非要从Url传递UserID来判断权限呢?
    用Session不是很好吗?
      

  9.   


    呵呵,我想你的意思是在A系统中用window.open打开系统B是吧? 但我是受到限制的,通过A系统的配置功能把B的链接加到A的菜单中,打开时传递的参数,打开的方式都已经被限制死了.这一点我刚开始没有说明白,抱歉.
      

  10.   


    A与B系统不是一个系统,A是公司购买的一个公司的产品(.NET1.1,2003的,没办法改动程序),B是我自己开发的(.NET2.0,2008开发的).
    同时A与B不在一个服务器上,但我却要使用A系统中企业组织架构及员工的数据(判断进入的用户是哪个部门的,哪个角色等等).所以在系统B中只根据传入的一个用户ID来判断用户身份.有什么更好的解决方案的话请提示一下,谢谢.
      

  11.   

    那么从A传一个用户ID过来,这个还是你在A系统上开发的吧
    你可以在A系统上传递用户ID,并加上一个根据这个ID加密的一个Key,传递到B系统
    到B系统再解密,如果结果正确,就验证通过类似于点击QQ图标,弹出的IE窗口能自动通过验证。
      

  12.   

    这个Key,最好能根据系统日期加密,这样每天的Key都不同了,相对也会安全一些但是如果你知道今天某个人的Key,还是可以通过复制的方法直接进入
    那么还可以这么做,Key是根据UserId和系统时间(精确到秒)加密,
    然后到B系统解密出这个系统时间,如果这个时间与当前时间相比,误差不超过1分钟,就允许验证通过
      

  13.   


    呵呵,可惜地很,从系统A传递参数到别的网址是A自带的功能.其实有参数加密的选项,但不知道怎么解密,很是郁闷.122706C2147AED568A312CC0870775C060B8000F1BD042DB12B4B873F755A2E1
    122706C2147AED568A312CC0870775C060B8000F1BD042DBFEA0B3D629F4A442
    122706C2147AED568A312CC0870775C0CD58B5FE6495820DBF3E3A3F832C7F23上面的值是"07100058"的密文,每次后面的一些位并不一样,谁知道系统A是根据什么操作的呢,也许是以时间做密钥,也许只不过把传递的参数打乱了,然后放在固定的位置,其余的位置加随便字符等等.
    本来想反编译A的代码,后来发现A系统非常庞大复杂,有些东西隐藏得非常深,于是就放弃了.不值得.
      

  14.   


    window.open 能隐藏吗? 页面点击右键》属性 还不是一样可以看见