- 中文名
- 权限
- 外文名
- privilege
- 词 性
- 名词
- 释 义
- 职能权利范围
-
权限漏洞:水平权限漏洞、垂直权限漏洞
2019-07-31 19:21:31水平权限漏洞是指Web应用程序接收到用户请求时,没有判断数据的所属人,或者在判断数据所属人时是从用户提交的参数中获取了userid,导致攻击者可以自行修改userid修改不属于自己的数据。 漏洞示例: XXX/...水平权限漏洞是指Web应用程序接收到用户请求时,没有判断数据的所属人,或者在判断数据所属人时是从用户提交的参数中获取了userid,导致攻击者可以自行修改userid修改不属于自己的数据。
漏洞示例:
XXX/getAddress?id=1
如上,攻击者修改addressId即可得到他人的address信息。开发容易习惯性的在生成CRUD(增查改删)表单(或AJAX请求)的时候根据认证过的用户身份来找出其有权限的被操作对象的id来提供入口,然后让用户提交请求,并根据这个id来操作相关对象。在处理CRUD请求时,都天真地默认只有有权限的用户才知道这个入口,进而才能操作相关对象,因此就不再校验权限了。可悲剧的是大多数对象的ID都被设置为自增整型,所以攻击者只要对相关id加1、减1、直至遍历,就可以操作其他用户所关联的对象了。
修复方案:
1、最正规的方案:把权限的控制转移到数据接口层中,避免出现select/update/delete ... where addressID=#addressID#的SQL语句,使用select/update/delete... where addressID=#addressID# and ownerId=#userId#来代替,要求web层在调用数据接口层的接口时额外提供userid,而这个userid在web层看来通常只能通过seesion来取到,以防用户造假。但这个方案的缺陷在于实现起来要改动底层的设计,所以不适合作为修复方案,更适合作为在最开始设计时的统一控制方案。
2、最直接有效的修复方案:在web层的逻辑中做鉴权,检查提交CRUD请求的操作者(通过session或token等加密信息中得到,以防造假)与目标对象的权限所有者是否一致,如果不一致则阻断。这个方案实现成本低、能确保漏洞的修复质量,缺点是增加了一次查库操作。我之前一直用这种方案来对已发生的水平权限漏洞做紧急修复。
另外的方法:
1、可对ID加密
2、使用UUID
3、每一个信息增加一个发布人的字段,修改的人必须与发布的人为同一个人才可以访问
垂直权限漏洞是指Web应用没有做权限控制,或仅仅在菜单上做了权限控制,导致恶意用户只要猜到了其他页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。
修复方案:
只需要对url资源进行权限验证即可。
-
java web简单权限管理设计
2015-03-19 23:23:05推荐最新技术springboot版权限管理(java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大! 注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有...源码免费下载地址:关注微信公众号“虾米聊吧”,回复关键字“权限”
推荐最新技术springboot版权限管理(java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大!
注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有帮助。
springboot权限管理系统介绍地址:https://blog.csdn.net/zwx19921215/article/details/97806078
springboot权限管理系统初级版下载地址:http://zyshare.cn/resource/detail/3
springboot权限管理系统高级版下载地址:http://zyshare.cn/resource/detail/7
springboot个人博客系统:https://blog.csdn.net/zwx19921215/article/details/102665020
后台管理系统模板html打包下载: http://zyshare.cn/resource/detail/14
最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。
一套最基本的权限管理包括用户、角色、资源。
数据库设计
我的设计如下:
用户:user
角色:role
用户-角色:user_role
资源:resource(包括上级菜单、子菜单、按钮等资源)
角色-资源:role_resource
标准的权限管理系统设计为以上5张表。
注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现
效果图:
项目结构
后台实现
展示层采用ztree树
role.jsp
<%@ page contentType="text/html;charset=UTF-8"%> <%@ include file="/views/back/include/taglib.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="decorator" content="back" /> <script type="text/javaScript"> //打开菜单窗口 function openMenuDialog(){ var selected = $("#list").datagrid('getSelected'); if (selected != null) { $("#id").val(selected.id); queryMenus(selected.id); $("#menuWindow").window("open"); } else { $.messager.alert('提示', "未选择数据!"); } } //角色-菜单信息入库 function ajaxSubmit(rid,idstr){ $.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){ $.messager.alert('提示',obj.msg); $("#menuWindow").window('close'); },'json'); } </script> <!-- ztree --> <script type="text/javascript"> var tree = ""; var setting = { check : { chkboxType:{"Y":"ps","N":"s"},//勾选checkbox对于父子节点的关联关系,取消勾选时不关联父 chkStyle:"checkbox", enable : true //是否复选框 }, //数据 data : { simpleData : { enable : true } } }; //查询菜单信息 function queryMenus(roleId){ $.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) { for (var i = 0; i < zNodes.length; i++) { if (zNodes[i].isParent) { } else { //zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标 } } tree = $.fn.zTree.init($("#tree"), setting, zNodes); tree.expandAll(true);//全部展开 //var nodes = treeObj.getNodes(); }, 'json'); } //获取选中节点 function onCheck(){ var rid = $("#id").val(); var treeObj=$.fn.zTree.getZTreeObj("tree"); var nodes=treeObj.getCheckedNodes(true); var ids = new Array(); for(var i=0;i<nodes.length;i++){ //获取选中节点的值 ids.push(nodes[i].id); // v+=nodes[i].id + ","; //alert(nodes[i].id); } ajaxSubmit(rid,ids); } </script> </head> <body> <!-- 数据表格 --> <table id="list" url='${ctx}/role/list/page.jhtml' method='post' class="easyui-datagrid" style="width:100%;" fitcolumns="true" toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'> <thead> <tr> <th field='name' sortable='true' width='100'>角色名称</th> <th field='description' width='200' align='right'>描述</th> <th field='createTimeFormat' width='150' align='center'>创建时间</th> </tr> </thead> </table> <!-- 编辑栏 --> <div id="tb" style="padding:5px 5px;"> <div> <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission> <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission> <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission> <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限</a></p2p:permission> </div> <!-- 搜索项 --> <div style="margin-top:5px;padding-left:5px"> 用户名: <input id="query_name" class="easyui-textbox" type="text" style="width:110px" /> 创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px"> 至: <input id="query_endDate" class="easyui-datebox" style="width:110px"> <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询</a> </div> </div> <!-- 权限窗口 --> <div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px"> <div id="tree" class="ztree" style="padding: 10px 20px;"></div> </div> <div id="menuWindowfooter" style="padding:5px;text-align:right;"> <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a> </div> </body> </html>
action层
RoleAction.java@RequestMapping(value = "/treedata.jhtml") @ResponseBody public String treedata(HttpServletRequest request, Model model) { DynamicParams params = new DynamicParams(request); List<Map<String, Object>> mapList = Lists.newArrayList(); params.put("allMenu", "allMenu"); List<Menu> list = authManager.findMenuList(params); List<RoleMenu> roleMenus = authManager.findRoleMenuList(params); for (int i = 0; i < list.size(); i++) { Menu e = list.get(i); Map<String, Object> map = Maps.newHashMap(); map.put("id", e.getId()); map.put("pId", e.getParentId() != null ? e.getParentId() : 0); map.put("name", e.getName()); for (RoleMenu roleMenu : roleMenus) { if (roleMenu.getMenuId() == e.getId()) { map.put("checked", true); } } mapList.add(map); } return toJson(mapList); }
service层
AuthManager.java
// 菜单管理 public List<Menu> findMenuList(DynamicParams params) { List<Menu> menus = new ArrayList<Menu>(); if ("allMenu".equals(params.getString("allMenu"))) { menus = menuDao.findList(params); } else { // 通过用户查询角色 List<UserRole> userRoles = userRoleDao.findList(params); // 通过角色查询菜单 List<RoleMenu> roleMenus = new ArrayList<RoleMenu>(); if (userRoles != null && userRoles.size() > 0) { for (UserRole userRole : userRoles) { params = new DynamicParams(); if (userRole != null) { if (userRole.getRoleId().equals(params.getString("rid"))) { break; } params.put("roleId", userRole.getRoleId().toString()); List<RoleMenu> rms = roleMenuDao.findList(params); for (RoleMenu roleMenu : rms) { roleMenus.add(roleMenu); } } } } // 查询菜单信息 for (RoleMenu roleMenu : roleMenus) { if (roleMenu != null) { Menu menu = menuDao.find(roleMenu.getMenuId()); if (menu != null) { menus.add(menu); } } } menus = removeDuplicate(menus); Collections.sort(menus); } return menus; }
/** * 去除菜单中重复项 * * @param list * @return */ private List<Menu> removeDuplicate(List<Menu> list) { List<Menu> result = new ArrayList<Menu>(); Set<Long> menuIds = new HashSet<Long>(); for (int i = 0; i < list.size(); i++) { Menu m = list.get(i); if (m != null && menuIds.add(m.getId())) { result.add(m); } } return result; }
public List<RoleMenu> findRoleMenuList(DynamicParams params) { List<RoleMenu> roleMenus = roleMenuDao.findList(params); return roleMenus; }
Dao层
menuDao
@Override protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) { sql.append("select s.* from sys_menu s where 1=1 "); String parentId = params.getString("parentId"); if (StringUtils.isNotBlank(parentId)) { sql.append(" and parent_id = ? "); args.add(parentId); } String sort = params.getString("sort"); String order = params.getString("order"); if (StringUtils.isNotBlank(sort)) { sql.append(" order by ").append(hump2underline(sort)); if (StringUtils.isNotBlank(order)) { sql.append(" " + order); } else { sql.append(" desc "); } } else { sql.append("order by sort asc,id desc "); } }
userRoleDao@Override protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) { sql.append("select s.* from sys_user_role s where 1=1 "); Long adminId = params.getLong("adminId"); if (adminId != null) { sql.append(" and s.user_id = ?"); args.add(adminId); } }
roleMenuDao@Override protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) { sql.append("select s.* from ").append("sys_role_menu").append(" s where 1=1 "); Long adminId = params.getLong("roleId"); if (adminId != null) { sql.append(" and s.role_id = ?"); args.add(adminId); } }
在WEB-INF目录下建立文件夹tlds 建立自定义标签文件shiros.tld,我们通过自定义标签实现页面按钮的控制。
<span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>p2p permission taglib</description> <display-name>permission taglib</display-name> <tlib-version>1.0</tlib-version> <short-name>p2p_back</short-name> <uri>http://vanfon.p2p.cn/</uri> <tag> <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description> <name>permission</name> <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class> <body-content>JSP</body-content> <attribute> <description></description> <name>module</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description></description> <name>code</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib></span>
自定义标签类
package com.vanfon.p2p.back.tag; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import com.vanfon.p2p.entity.system.Admin; import com.vanfon.p2p.entity.system.Menu; import com.vanfon.p2p.manager.system.AuthManager; import com.vanfon.p2p.utils.DynamicParams; import com.vanfon.p2p.utils.SpringContextHolder; /** * 权限控制标签 * * @author zhangwx * @date 2015-2-5 */ public class PermissionTag extends TagSupport { /** * */ private static final long serialVersionUID = 4592227792811389132L; private String module;// 属性名必须与JSP自定义标签的属性名一样 private String code; public String getModule() { return module; } public void setModule(String module) { this.module = module; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Override public int doStartTag() throws JspException { boolean result = false; HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象 Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户 if (admin != null) { if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员 result = true; } else { DynamicParams params = new DynamicParams(); params.put("id", String.valueOf(admin.getId())); params.put("module", this.module); params.put("code", this.code); AuthManager authManager = SpringContextHolder.getBean(AuthManager.class); List<Menu> userRoleAuths = authManager.findUserRoleAuthList(params); if (userRoleAuths != null && userRoleAuths.size() > 0) { result = true; } } } return result ? EVAL_BODY_INCLUDE : SKIP_BODY; } }
以上就是该权限管理中权限树(为角色分配权限)的大体实现。
项目源码下载地址:http://www.zyshare.cn/resource/detail/1
注:由于本项目年代久远,所以技术比较老旧,新人学习建议此项目 java后台通用权限管理系统(springboot)
推荐项目:java后台通用权限管理系统(springboot)
博主qq:193459197 , qq群技术交流与支持:557911445
关注微信公众号“虾米聊吧”,回复“权限”获取源码,后续持续放送技术架构和资料干货!!!
一个热衷于分享技术和生活的程序猿,让我们一起交流吧~
微信扫描二维码,关注我的公众号
-
Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
2017-06-22 17:01:42权限简介 Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。 Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。 Linux下权限的粒度...权限简介
- Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
- Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
- Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
- Linux上通常使用chmod命令对文件的权限进行设置和更改。
一、快速入门
更改文件权限 (chmod命令)
一般使用格式
chmod [可选项] <mode> <file...>
参数说明: [可选项] -c, --changes like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作) -f, --silent, --quiet suppress most error messages (若该档案权限无法被更改也不要显示错误讯息) -v, --verbose output a diagnostic for every file processed(显示权限变更的详细资料) --no-preserve-root do not treat '/' specially (the default) --preserve-root fail to operate recursively on '/' --reference=RFILE use RFILE's mode instead of MODE values -R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更) --help 显示此帮助信息 --version 显示版本信息 [mode] 权限设定字串,详细格式如下 : [ugoa...][[+-=][rwxX]...][,...], 其中 [ugoa...] u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。 [+-=] + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。 [rwxX] r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 [file...] 文件列表(单个或者多个文件、文件夹)
范例:
- 设置所有用户可读取文件 a.conf
chmod ugo+r a.conf 或 chmod a+r a.conf
- 设置 c.sh 只有 拥有者可以读写及执行
chmod u+rwx c.sh
- 设置文件 a.conf 与 b.xml 权限为拥有者与其所属同一个群组 可读写,其它组可读不可写
chmod a+r,ug+w,o-w a.conf b.xml
- 设置当前目录下的所有档案与子目录皆设为任何人可读写
chmod -R a+rw *
数字权限使用格式
在这种使用方式中,首先我们需要了解数字如何表示权限。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,
如:
rwx = 4 + 2 + 1 = 7
rw = 4 + 2 = 6
rx = 4 +1 = 5
即
若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7
若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6
若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5
上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。语法格式为 :
chmod <abc> file...
其中 a,b,c各为一个数字,分别代表User、Group、及Other的权限。 相当于简化版的 chmod u=权限,g=权限,o=权限 file... 而此处的权限将用8进制的数字来表示User、Group、及Other的读、写、执行权限
范例:
- 设置所有人可以读写及执行
chmod 777 file (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)
- 设置拥有者可读写,其他人不可读写执行
chmod 600 file (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )
更改文件拥有者(chown命令)
linux/Unix 是多人多工作业系统,每个的文件都有拥有者(所有者),如果我们想变更文件的拥有者(利用 chown 将文件拥有者加以改变),一般只有系统管理员(root)拥有此操作权限,而普通用户则没有权限将自己或者别人的文件的拥有者设置为别人。
语法格式:
chown [可选项] user[:group] file...
使用权限:root 说明: [可选项] : 同上文chmod user : 新的文件拥有者的使用者 group : 新的文件拥有者的使用者群体(group)
范例:
- 设置文件 d.key、e.scrt的拥有者设为 users 群体的 tom
chown tom:users file d.key e.scrt
- 设置当前目录下与子目录下的所有文件的拥有者为 users 群体的 James
chown -R James:users *
二、Linux权限详解
Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。这也是Linux有别于Windows的机制,也是基于这个权限机制,Linux可以有效防止病毒自我运行,因为运行的条件是必须要有运行的权限,而这个权限在Linux是用户所赋予的。
Linux的文件权限有以下设定:
- Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
- Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。
- 通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
如果我们要表示一个文件的所有权限详情,有两种方式:
- 第一种是十位二进制表示法 ,(三个属组的每个权限使用一个二进制位,再加一个最高位共十位),可简化为三个八进制数字形式(如 755)
- 另外一种十二位二进制表示法(十二个二进制位),可简化为四个八进制数字形式(如4755)
十位权限表示
常见的权限表示形式有:
-rw------- (600) 只有拥有者有读写权限。 -rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。 -rwx------ (700) 只有拥有者有读、写、执行权限。 -rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。 -rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。 -rw-rw-rw- (666) 所有用户都有文件读、写权限。 -rwxrwxrwx (777) 所有用户都有读、写、执行权限。
后九位解析: 我们知道Linux权限总共有三个属组,这里我们给每个属组使用三个位置来定义三种操作(读、写、执行)权限,合起来则是权限的后九位。 上面我们用字符表示权限,其中 -代表无权限,r代表读权限,w代表写权限,x代表执行权限。(后九位的前3位对应拥有者权限、4-6位对应群组权限、7-9对应其他组权限)
实际上,后九位每个位置的意义(代表某个属组的某个权限)都是固定的,如果我们将各个位置权限的有无用二进制数 1和 0来代替,则只读、只写、只执行权限,可以用三位二进制数表示为
r-- = 100 -w- = 010 --x = 001 --- = 000
转换成八进制数,则为 r=4, w=2, x=1, -=0(这也就是用数字设置权限时为何是4代表读,2代表写,1代表执行)
实际上,我们可以将所有的权限用二进制形式表现出来,并进一步转变成八进制数字:
rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4 -wx = 011 = 3 -w- = 010 = 2 --x = 001 = 1 --- = 000 = 0
由上可以得出,每个属组的所有的权限都可以用一位八进制数表示,每个数字都代表了不同的权限(权值)。如 最高的权限为是7,代表可读,可写,可执行。
故 如果我们将每个属组的权限都用八进制数表示,则文件的权限可以表示为三位八进制数
-rw------- = 600 -rw-rw-rw- = 666 -rwxrwxrwx = 777
关于第一位最高位的解释: 上面我们说到了权限表示中后九位的含义,剩下的第一位代表的是文件的类型,类型可以是下面几个中的一个:
d代表的是目录(directroy) -代表的是文件(regular file) s代表的是套字文件(socket) p代表的管道文件(pipe)或命名管道文件(named pipe) l代表的是符号链接文件(symbolic link) b代表的是该文件是面向块的设备文件(block-oriented device file) c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
十二位权限(Linux附加权限)
附加权限相关概念
linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。
SET位权限:
suid/sgid是为了使“没有取得特权用户要完成一项必须要有特权才可以执行的任务”而产生的。 一般用于给可执行的程序或脚本文件进行设置,其中SUID表示对属主用户增加SET位权限,SGID表示对属组内用户增加SET位权限。执行文件被设置了SUID、SGID权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。在许多环境中,suid 和 sgid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。所以应该尽量避免使用SET位权限程序。(passwd 命令是为数不多的必须使用“suid”的命令之一)。
- suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。
- sgid(set Group ID,set GID)意思也是一样,只是把上面的进程拥有者改成进程组就好了。
SET位权限表示形式(10位权限):
如果一个文件被设置了suid或sgid位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了suid还设置了x(执行)位,则相应的执行位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如:
1、-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限 2、-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限 3、-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限 4、-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
设置方式:
SET位权限可以通过chmod命令设置,给文件加suid和sgid的命令如下(类似于上面chmod赋予一般权限的命令):
chmod u+s filename 设置suid位 chmod u-s filename 去掉suid设置 chmod g+s filename 设置sgid位 chmod g-s filename 去掉sgid设置
粘滞位权限:
粘滞位权限即sticky。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用ls查看其属性时,其他用户权限处的x将变为t。 使用chmod命令设置目录权限时,+t、-t权限模式可分别用于添加、移除粘滞位权限。
粘滞位权限表示形式(10位权限):
一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上。如果文件设置了sticky还设置了x(执行)位,其他组用户的权限的可执行位为t(小写)。但是,如果没有设置x位,它将表示为T(大写)。如:
1、-rwsr-xr-t 表示设置了粘滞位且其他用户组有可执行权限 2、-rwSr--r-T 表示设置了粘滞位但其他用户组没有可执行权限
设置方式:
sticky权限同样可以通过chmod命令设置:
chmod +t <文件列表..>
十二位的权限表示方法
附加权限除了用十位权限形式表示外,还可以用用十二位字符表示。
11 10 9 8 7 6 5 4 3 2 1 0 S G T r w x r w x r w x
SGT分别表示SUID权限、SGID权限、和 粘滞位权限,这十二位分别对应关系如下:
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位(后九位)。
在这十二位的每一位上都置值。如果有相应的权限则为1, 没有此权限则为0。
-rw-r-sr-- 的值为: 0 1 0 1 1 0 1 0 0 1 0 0 -rwsr-xr-x 的值为: 1 0 0 1 1 1 1 0 1 1 0 1 -rwsr-sr-x 的值为: 1 1 0 1 1 1 1 0 1 1 0 1 -rwsr-sr-t 的值为: 1 1 1 1 1 1 1 0 1 1 0 1
如果将则前三位SGT也转换成一个二进制数,则
- suid 的八进制数字是4
- sgid 的代表数字是 2
- sticky 位代表数字是1
这样我们就可以将十二位权限三位三位的转化为4个八进制数。其中
- 最高的一位八进制数就是suid,sgdi,sticky的权值。
- 第二位为 拥有者的权值
- 第三位为 所属组的权值
- 最后一位为 其他组的权值
附加权限的八进制形式
通过上面,我们知道,正常权限和附加权限可以用4位八进制数表示。类似于正常权限的数字权限赋值模式(使用三位八进制数字赋值)
chmod <abc> file...
我们可以进一步使用4位八进制数字同时赋值正常权限和附加权限。
chmod <sabc> file...
其中s是表示附加权限的把八进制数字,abc与之前一致,分别是对应User、Group、及Other(拥有者、群组、其他组)的权限。因为SUID对应八进制数字是4,SGID对于八进制数字是2,则“4755”表示设置SUID权限,“6755”表示同时设置SUID、SGID权限。
我们进一步将上小节的例子中的二进制数转变为八进制表示形式,则
-rw-r-sr-- = 0 1 0 1 1 0 1 0 0 1 0 0 = 2644 -rwsr-xr-x = 1 0 0 1 1 1 1 0 1 1 0 1 = 4755 -rwsr-sr-x = 1 1 0 1 1 1 1 0 1 1 0 1 = 6755 -rwsr-sr-t = 1 1 1 1 1 1 1 0 1 1 0 1 = 7755
对比范例:
- 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行
chmod 755 netlogin
- 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行,并且设置suid
chmod 4755 netlogin
chmod 4755与chmod 755对比多了附加权限值4,这个4表示其他用户执行文件时,具有与所有者同样的权限(设置了SUID)。
为什么要设置4755 而不是 755?
假设netlogin是root用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。但假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。 -
Django权限控制
2018-12-26 14:38:14自己搭建后台网站,需求:实现类似django Admin站点对每一张表的增删改查权限控制。 实现步骤: 1.权限控制Django框架已自带,共6张表,User表,Group表,UserGroup表,Permission表,GroupPermission表,User...自己搭建后台网站,需求:实现类似django Admin站点对每一张表的增删改查权限控制。
实现步骤:
1.权限控制Django框架已自带,共6张表,User表,Group表,UserGroup表,Permission表,GroupPermission表,UserPermission表,一般情况下,使用默认即可。
2.若User表自定义,需继承Django自带AbstractUser类,Group表同理。
3.创建类PermissionControl继承BasePermission,重写has_permission和has_object_permission方法。
import re from django.contrib.auth.models import AnonymousUser from rest_framework.permissions import BasePermission class PermissionControl(BasePermission): """自定义权限控制类""" def has_permission(self, request, view): # 0.若用户未登陆直接访问,返回未授权 if isinstance(request.user, AnonymousUser): return False permission_list = request.user.role.get_all_permissions() # 1.角色管理-角色 if request.method == 'GET' and re.match(r'^/role_manage/roles/$', request.path): if 'view_role' in permission_list: return True else: return False elif request.method == 'POST' and re.match(r'^/role_manage/roles/$', request.path): if 'add_role' in permission_list: return True else: return False elif request.method == 'PUT' and re.match(r'^/role_manage/roles/\d+/$', request.path): if 'change_role' in permission_list: return True else: return False elif request.method == 'PATCH' and re.match(r'^/role_manage/roles/\d+/$', request.path): if 'change_role' in permission_list: return True else: return False elif request.method == 'DELETE' and re.match(r'^/role_manage/roles/\d+/$', request.path): if 'delete_role' in permission_list: return True else: return False # 同理,判断所有路由及权限 def has_object_permission(self, request, view, obj): """GET请求单个对象时执行""" # 0.若用户未登陆直接访问,返回未授权 if isinstance(request.user, AnonymousUser): return False permission_list = request.user.get_all_permissions() # 1.角色管理-角色 if request.method == 'GET' and re.match(r'^/role_manage/roles/\d+/$', request.path): if 'view_role' in permission_list: return True else: return False # 同理,判断所有路由及权限
4.视图中使用,本网站使用drf框架,仅需在要控制权限的类视图中加上permission_classes权限控制即可。
class RoleViewSet(ModelViewSet): """ list: 查询所有角色 read: 根据角色id,查询角色 create: 创建角色 delete: 根据角色id,删除角色 update: 根据角色id,更新角色信息 partial_update: 根据角色id,部分更新角色信息 """ queryset = Role.objects.filter(is_delete=0).all() serializer_class = RoleSerializer permission_classes = [PermissionControl] filterset_class = RoleFilter pagination_class = StandarPageNumberPagination
5.数据库中组(角色)权限表需添加角色权限,如:
-
拿到域管权限后的域内网络拓扑
2020-11-13 17:34:56拿到域管权限后我们除了做权限维持之外还需要对域内的网络情况进行探索,这篇文章就这项技能做一个概述。 2.实现本机使用dnscmd进行远程查询 首先我们需要利用域管凭据获得admin$共享,或者直接获得域控机器的shell... -
SeEnableDelegationPrivilege权限的利用
2020-12-23 16:43:00SeEnableDelegationPrivilege权限的拥有者是谁?1. 通过powerview2. 通过GPO3.通过UserRights(只在域控上执行有效)3. 如何给其他用户配置SeEnableDelegationPrivilege权限4.如何利用拥有... -
赋予域内普通用户dcsync权限来变向权限维持
2020-12-25 16:40:18DCsync是几个权限的集合体,如果普通用户想具有DCsync权限,可以给对象添加以下三条ACE: DS-Replication-Get-Changes,对应GUID为:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 DS-Replication-Get-Changes-All,对应... -
kafka topic 权限控制
2020-04-20 12:42:05kafka topic 权限控制 kafka官网 配置 设置权限 #查看权限 ./kafka-acls.sh --authorizer-properties zookeeper.connect=test01:2181,test02:2181,test03:2181 --list #添加权限 ./kafka-acls.sh --authorizer-... -
Oracle创建用户并授权dba权限
2018-07-31 13:35:21很多时候我们用拥有DBA权限的用户 从oracle数据库导出数据,那么再导入新的数据库时就还得需要DBA权限的用户,下面是如何创建一个新用户并授予DBA权限命令。 1.用有dba权限的用户登录:sys用户 2.创建一个新用户:... -
iOS14相册权限适配 :Limited Photo Access模式、PHAccessLevel(请求查询limited权限在 accessLevel 为...
2020-08-20 11:52:18相册新增选择权限类型 PHAuthorizationStatusLimited :当页面弹出请求权限 Alert 时,会有 Select Photos… 选项,用户选择该选项时,会弹出页面供用户选择允许App访问的图片/照片。 权限提示框会在每次冷启动后... -
Linux常用命令:chmod修改文件权限 777和754
2018-05-10 11:34:33常用下面这条命令:chmod 777 文件或目录示例:chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。如果是Ubuntu系统,可能需要加上sudo来执行:sudo chmod 777 /etc/... -
[Windows10]Win10如何获取最高管理员权限
2018-09-17 17:48:56使用Windows10的时候常常发现我们没有管理员权限,这对我们使用造成了巨大麻烦。今天我来分享一下 win10里面怎么获取最高管理员权限。 (一)Windows10专业版/企业版/教育版方法 1,按下win+R键唤出“运行”窗口,... -
JAVAWEB开发之权限管理(一)——权限管理详解(权限管理原理以及方案)、不使用权限框架的原始授权方式详解
2017-07-13 13:35:183. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户授权 6. shiro与企业web项目整合开发的方法 权限管理原理知识 什么是权限管理 只要有用户参与的系统一般... -
Android 6.0 运行时权限管理最佳实践
2016-09-11 13:11:36在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,很多人问我关于权限管理的问题,往往我都没有直接回答,因为... -
设计权限管理模块
2019-05-15 12:25:58我们比较常见的就是基于角色的访问控制,用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间、角色与... -
如何用 Vue 实现前端权限控制(路由权限 + 视图权限 + 请求权限)
2018-04-12 10:43:48随着前后端分离架构的流行,权限控制这个曾经陌生的话题开始进入很多前端同学的视野,作为一名前端,可能部分同学会认为权限是后端的事,其实这个想法是片面的,后端是权限控制的最后一扇门,而在这之前,做好前端... -
MySQL查看用户权限及权限管理
2019-10-22 15:47:55一、 MySQL权限级别介绍 全局——可以管理整个MySQL 库——可以管理指定的数据库 表——可以管理指定数据库的指定表 字段——可以管理指定数据库的指定表的指定字段 权限存储在mysql库的user, db, tables_... -
Android 6.0 运行时权限处理完全解析
2016-02-22 09:31:58转载请标明出处: ...随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化。对于6.0的几个主要的变化,查看查看官网的这篇文章http://develope -
文件夹访问被拒绝 你需要权限来执行此操作,您需要权限来执行此操作
2018-08-09 18:42:43网上大多数说法就是该文件夹的权限所有者,改为Administrator所有者就可以操作,但是,很多时候是无法修改的,而且又慢有不好实现(毕竟能修改权限的情况还是比较少的),怎么都得不到权限,这个时候怎么办呢?... -
Linux 下获取Root权限的几种方法
2019-05-15 21:44:11方法分为永久性获取root权限以及非永久性获取Root权限 非永久性获取Root权限: 非永久性获取Root权限可以在我们要键入的命令之前加上sudo前缀。 如我们要键入的命令是: rm ,以Root用户执行的方式就是: sudo rm 这样... -
Windows10局域网内共享资源(你没有权限访问 或者 账号或者密码错误)
2018-04-08 12:58:22你没有权限访问,请问网络管理员联系 账号或者密码错误 解决访问很粗暴,就是直接设置关掉这个账号或者密码验证。 在“网络和共享中心”的“所有网络”最底下,把“密码保护的共享”关掉... -
oracle用户权限与管理员权限问题
2018-08-07 15:25:561、stu用户没有建表权限→需sys或system用户赋权 system默认:manager sys默认:change_on_install 使用SQL Plus登录数据库时,system使用密码manager可直接登录。 但如果是sys用户,密码必须加上as sysdba,即... -
Android权限之动态权限
2019-05-05 14:57:08安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将... -
从administrator到system权限的几种方式
2020-12-28 15:46:44对windows中从admin到system权限到方法做一个小的记录。主要参考了三好学生的博客,三好学生博客地址。 以下利用方式的前提是已经获取了计算机的administrator权限。 1. 通过sc命令(只适用于win xp) 以syste -
chmod修改权限的用法
2019-02-27 23:15:50一、chmod作用:修改文件、目录的权限 二、语法:chmod [对谁操作][操作符][赋予的权限] 文件名 三、操作对象:u 用户user,表现文件或目录的所有者 g 用户组group,表现文件或目录所属的用户组 o 其他用户... -
功能权限和数据权限
2017-11-02 11:01:05在任何系统中都需要权限控制,没有权限,系统是不健全的时刻会受到各种问题的干扰。 权限分为数据权限和功能权限 1、功能权限: 能不能打开某一个界面,能不能触发一个界面上的一个按钮,某些业务员能不能删除... -
权限管理——权限模型和权限控制
2016-07-30 10:40:45等我接收权限的时候,权限模型和表已经定好了的,我也只是带领大家开发功能。不过还是要啰嗦一下权限模型的初始化和进化状态。 上篇博客也说过资源是通过权限或者是许可来控制的。所以如下图: -
Linux权限管理(基本权限、默认权限)
2017-08-30 23:39:56一、文件基本权限 1-1.基本权限的修改 -rw-r--r-- - 第一个"-"表示文件类型(- 文件,d 目录,l 软链接文件) - rw- r-- r-- u所有者 g所属组 o其它人 其中r读,w写,x执行 (1).chmod [选项] ... -
shiro 用户权限修改 动态更新权限 重新赋值权限
2016-12-13 10:17:53shiro重新赋值权限 (比如:给一个角色临时添加一个权限,需要调用此方法刷新权限,否则还是没有刚赋值的权限) -
java权限管理与用户角色权限设计
2018-06-16 00:14:28java权限管理与用户角色权限设计2016年10月29日 19:24:41阅读数:12545实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端...
-
MySQL 表操作 删除表 清空表 主键归0
-
如何让Kafka在保证高性能、高吞吐的同时通过各种机制来保证高可用性?
-
python数据分析基础
-
[论文笔记]LegoOS:一种硬件资源分解的分布式操作系统
-
一种用于无人驾驶车辆的轨迹跟踪控制方法.pdf
-
【2021】UI自动化测试Selenium3
-
21年新接口自动化测试视频postman教程 零基础接口测试
-
【Decouple】《Improving Semantic Segmentation via Decoupled Body and Edge Supervision》
-
MYSQL索引数据结构
-
led_3_1.rar流水灯例子
-
西安博盛景润实业集团
-
led.rar单片机点亮二极管
-
three.js入门速成
-
Sysbench使用之二fileio
-
android笔试面试和实战课程
-
FFmpeg4.3系列之26:视频监控之H265多路摄像头播控项目实战
-
阿里云云计算ACP考试必备教程
-
易语言开发通达信DLL公式接口
-
WNMP安装一条龙step_by_step
-
单元测试UnitTest+Pytest【Selenium3】