OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3114|回复: 0

asp.net core 关于自增长ID数据保护(IDOR漏洞)

[复制链接]

143

主题

145

帖子

0

精华

高级会员

Rank: 4

积分
585
金钱
585
注册时间
2020-5-25
在线时间
42 小时
发表于 2020-9-29 16:36:53 | 显示全部楼层 |阅读模式
开始前先大概的描述下IDOR漏洞是啥。嗯! 举个例子,有一个角色下面有N个用户,拥有这个角色的用户都有自身创建的普通用户操作权限(比如删除)。我们一般情况都是通过表主键来操作这条记录的,那么这么一个功能就涉及到两个接口(查询列表,删除指定用户)。
嗯!查询列表的接口自然是要带着用户对应的主键的(通过删除接口传入ID),聪明的人应该想到了;此时ID是明文的并且主键我们一般都是自增长的,此时就会出现我们可以通过猜测这个参数进行恶意删除。嗯!此时有些人可能会想(也是几种解决方式):
  • 我可以通过对参数进行加密签名来处理。嗯!但是似乎不是很适合前端,因为JS啥的都给人家了,还谈啥密钥和加密方式。
  • JS处理不行,我服务端来进行数据操作验证总可以吧。嗯!确实可以。前台传入ID后台在一系列操作前进行身份信息条件筛选。(delete TableName where userID ={ID} and create_Id={login_userID})就是这么个意思。每次带着这么信息是不是哪里不好,万一团队开发有人忘记了叻,那就很有意思了(我们的用户数据随便你删,开心就好。。。)。这方法挺不错的,就是有点蛋疼。
  • 制造这个问题的原因不就是因为ID是数字自增长吗,我只要让主键无规律不就行了,比如时间戳加随机数,再比如GUID。猜?你慢慢猜去吧。但是这里面涉及到一个小问题,性能和存储空间的问题。(自增长主键和GUID查询性能和占用空间比较)
  • 正如三解决方案,我只要让抛到前台的主键是无规律的并且不可轻松枚举出来好像就可以了.此处是对称加密(百度“对称加密有哪些”)。
就第四种记录一笔,避免以后找不到回家的路。微软官方文档里已经有相关的介绍了,https://docs.microsoft.com/zh-cn ... view=aspnetcore-5.0  。至于怎么集成到程序里面八仙过海各显神通了。下面贴下我的神通。
我用的是微软自带的序列化组件,至于Newtonsoft.Json只是API不同罢了,逻辑一样。自带序列化组件代码:
[url=][/url]
  public class ProtectionConverter : JsonConverter<long>    {        private readonly ITimeLimitedDataProtector _protector;        public ProtectionConverter()        {            ///此处做了简单分装,看了官方文档自然不迷惑            _protector = Utility.UseDataProtectionProviderUtility.GetTimeLimitedDataProtector();        }        public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)        {            string val = reader.GetString();            if (string.IsNullOrEmpty(val))                return 0;            return long.Parse(_protector.Unprotect(val));        }        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)        {            string str = null;            if (value != 0)            {                var nowDate = DateTime.Now;                str = _protector.Protect(value.ToString(), nowDate.Date.AddHours(26) - nowDate);            }            writer.WriteStringValue(str);        }    }

用法:
[JsonConverter(typeof(ProtectionConverter))]
  public long ID { get; set; }

[url=][/url]


使用序列化组件特性方式来解决。看不懂时研究下JsonConvert

Newtonsoft.Json方式代码:
[url=][/url]
  ///JSON.NET    //public class ProtectionConverter : JsonConverter    //{    //    private readonly ITimeLimitedDataProtector _protector;    //    public ProtectionConverter()    //    {    //        _protector = CommonessHeleper.UseDataProtectionProviderHeleper.GetTimeLimitedDataProtector();    //    }    //    public override bool CanConvert(Type objectType)    //    {    //        return true;    //    }    //    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    //    {    //        return _protector.Unprotect(reader.Value.ToString());    //    }    //    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    //    {    //        var nowDate = DateTime.Now;    //        writer.WriteValue(_protector.Protect(value.ToString(), (nowDate.Date.AddHours(26) - nowDate)));    //    }    //}[url=][/url]



此处都是针对对象(POST居多)提交来数据加解密,如果非表单,对象提交咋办,
String key1=Request.Query["key1"];//获取url字符串String key2 = Request.Form["key2"];//获取表单
上代码放在自定义管道和自定义过滤器里都可以。
有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 01:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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