FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 12380|回复: 18
打印 上一主题 下一主题

如何避免用户绕开tree,直接敲地址进子页面

[复制链接]
跳转到指定楼层
楼主
发表于 2017-6-30 16:55:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想,点击树节点的时候,先往cookie写个值,
子页面判断页面名称是否与cookie一致,
这样可以避免用户直接敲页面地址,打开子页面

但发现 好像tree.Node.NavigateUrl 优先于 tree.NodeCommand 执行

这样导致cookie里没有值

请教各位大神有什么其他的方法可以实现这个想法?

沙发
 楼主| 发表于 2017-6-30 16:56:09 | 只看该作者
哦,补充一下
tree是根据权限动态生成的,只显示有权限的树节点
板凳
 楼主| 发表于 2017-6-30 17:16:07 | 只看该作者
--------------------------PageHelper.cs-------------------------------------------

using System.Linq;
using System.Web;
using System.Data;
using FineUI;
using System.Web.UI;

public class PageHelper
{
    public static bool Check_page(Page p)
    {
        //HttpSessionState Session = HttpContext.Current.Session;

        target = HttpContext.Current.Request.Cookies["target"].Value;
        string target1 = p.Request.CurrentExecutionFilePath;

        bool isAuthed = false;
        if ("/"+target == target1)
        {
            isAuthed = true;
        }
        return isAuthed;
    }



    //左侧树形权限菜单用
    private static DataTable DtTree;
   
    private static string uid;
    private static string target;

    private static void init_uid()
    {
        HttpRequest Request = HttpContext.Current.Request;
        uid = Request.Cookies["uid"].Value;

    }

    public static void Init_Auth(Tree TV, string P_ID, bool isNav)
    {
        init_uid();
        string connString = OraData.strConnection;
        string SQL1 = "SELECT DISTINCT A.P_ID,A.ID,A.NAME,A.TARGET,A.AUTH,A.VISIBLE,A.ICON,A.SORT FROM WEB_LEFT_TREE A LEFT JOIN WEB_ROLE_MENU B ON A.ID = B.R_MENU LEFT JOIN WEB_USER_ROLE C ON B.R_ID = C.U_ROLE  LEFT JOIN WEB_USER_MENU D ON A.ID = D.U_MENU ";
        SQL1 = SQL1 + "WHERE(A.AUTH = 0 OR C.U_ID = '" + uid + "' OR D.U_ID = '" + uid + "') AND A.VISIBLE = 1 ORDER BY A.ID,A.SORT ";
        DtTree = OraData.ExecuteDataTable(connString, CommandType.Text, SQL1, null);
        DataRow[] dr;
        if (P_ID == "")
        {
            dr = DtTree.Select("P_ID IS NULL");
        }
        else

        {
            dr = DtTree.Select("P_ID =" + P_ID + "");
        }

        if (dr.Count() > 0)
        {
            TV.Nodes.Clear();
            for (int i = 0; i < dr.Count(); i++)
            {
                TreeNode TNT = new TreeNode();
               
                TNT.Text = dr["NAME"].ToString();
                TNT.NodeID = dr["ID"].ToString();
                string IconPath = "~/extjs/res/icon/";
                if (dr["ICON"].ToString() == "")
                {
                    IconPath = IconPath + "folder" + ".png";
                }
                else
                {
                    IconPath = IconPath + dr["ICON"].ToString() + ".png";
                }
                TNT.IconUrl = (IconPath);
                if (isNav == true)
                {
                    if (dr["TARGET"].ToString() != "")
                    {
                        TNT.NavigateUrl = dr["TARGET"].ToString() + ".aspx";
                    }
                }
                TNT.EnableClickEvent = true;
               
                TV.Nodes.Add(TNT);
                NodeRecursion(TNT, dr["ID"].ToString(), isNav);
                TV.ExpandAllNodes();
            }
        }
    }

    private static void NodeRecursion(TreeNode TNP, string TND, bool isNav)
    {
        DataRow[] dr = DtTree.Select("P_ID ='" + TND + "' ");
        if (dr.Count() > 0)
        {
            TNP.Nodes.Clear();
            for (int i = 0; i < dr.Count(); i++)
            {
                TreeNode tn1 = new TreeNode();
                tn1.Text = dr["NAME"].ToString();
                tn1.NodeID = dr["ID"].ToString();
                string IconPath = "~/extjs/res/icon/";
                if (dr["ICON"].ToString() == "")
                {
                    IconPath = IconPath + "folder" + ".png";
                }
                else
                {
                    IconPath = IconPath + dr["ICON"].ToString() + ".png";
                }
                tn1.IconUrl = (IconPath);
                if (isNav == true)
                {
                    if (dr["TARGET"].ToString() != "")
                    {
                        tn1.NavigateUrl = dr["TARGET"].ToString() + ".aspx";
                    }
                }

                tn1.EnableClickEvent = true;

                TNP.Nodes.Add(tn1);
                NodeRecursion(tn1, dr["ID"].ToString(), isNav);
            }
        }
    }


}

End--------------------------PageHelper.cs-------------------------------------------



-------------------------Default.aspx.cs-------------------------------------------

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (DomainCheck("EXAS", "CQE") == true)
            {
                Init_left_tree();
                get_name();
                Alert.Show(u_name+" "+u_title+" 欢迎回来。","Computer Assisted Management System 3.0",MessageBoxIcon.Information);
            }
            else
            {
                Alert.Show("请使用有效的域账户登陆操作系统。", "", MessageBoxIcon.Warning);
            }
        }
    }

    protected void leftMenuTree_NodeCommand(object sender, TreeCommandEventArgs e)
    {
        //Session.Add("target", leftMenuTree.SelectedNode.NavigateUrl);
        HttpCookie cookie = new HttpCookie("target");
        cookie.Value = leftMenuTree.SelectedNode.NavigateUrl;
        cookie.Expires = DateTime.Now.AddDays(1);
        HttpContext.Current.Response.Cookies.Add(cookie);
    }

End-------------------------Default.aspx.cs-------------------------------------------


-------------------------子页面-------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (PageHelper.Check_page(this.Page) == false)
            {
                Response.Redirect("~/NoAuth.aspx");
            }
        }
    }
End-------------------------子页面-------------------------------------------------------
地板
发表于 2017-6-30 17:47:33 | 只看该作者
写个basepage页面,每个页面都继承这个basepage。在basepage里获取页面url,根据权限判断当前用户是否有权进入此页面。无权,respone.end()
5#
 楼主| 发表于 2017-6-30 18:28:29 | 只看该作者
zy32002 发表于 2017-6-30 17:47
写个basepage页面,每个页面都继承这个basepage。在basepage里获取页面url,根据权限判断当前用户是否有权 ...

凡是在子页面之外写的语句,在地址栏直接敲子页面的地址,都可以绕开的
6#
 楼主| 发表于 2017-6-30 18:29:56 | 只看该作者
zy32002 发表于 2017-6-30 17:47
写个basepage页面,每个页面都继承这个basepage。在basepage里获取页面url,根据权限判断当前用户是否有权 ...

凡是在子页面之外写的代码,在地址栏直接敲子页面的地址时,都是可以绕开的。
我觉得还是得想个办法,点treenode的时候做一下标记,在子页面load的时候对比这个标记,如果没有,就证明是直接敲地址进的
7#
发表于 2017-6-30 21:27:59 | 只看该作者
898806387 发表于 2017-6-30 18:29
凡是在子页面之外写的代码,在地址栏直接敲子页面的地址时,都是可以绕开的。
我觉得还是得想个办法,点t ...

这个真没必要,URL就是让人访问的,只要不是越权访问都不应该禁止
8#
 楼主| 发表于 2017-7-1 00:37:26 | 只看该作者
sanshi 发表于 2017-6-30 21:27
这个真没必要,URL就是让人访问的,只要不是越权访问都不应该禁止

比如说,我的tree菜单指向的链接有普通用户用的、有系统设置的、有人力资源的、有财务的。第一步,通过数据库查询,只生成用户有操作和查看权限的tree,但是仍然需要防范用户知道页面地址后敲地址绕过tree获取权限。当然,如果控件实现不了,可以在子页面load时再从数据库查询一次是否有权限,不过,如果控件能实现,便减少了读取数据库,提高效率
9#
发表于 2017-7-1 09:53:36 | 只看该作者
你怎么标记? url直接能访问到,怎么判断是否可以有权限。我一个普通员工直接财务页面操作,这安全??
再有你这你是权限的问题,和tree一点关系没有,就别提什么tree。
10#
发表于 2017-7-1 09:56:20 | 只看该作者
再有cookie都可以伪造的,不安全不推荐
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-4-26 21:08 , Processed in 0.048759 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表