asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]

asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]开始前先大概的描述下IDOR漏洞是啥。嗯!举个例子,有一个角色下面有N个用户,拥有这个角色的用户都有自身创建的普通用户操作权限(比如删除)。我们一般情况都是通过表主键来操作这条记录的,那么这么一个功能就涉及到两个接口(查询列表,删除指定用户)。嗯!查询列表的接口自然是要带着用户对应的主键的(通过删除接口传入ID),聪明的人应该想到了;此时ID是明文的并且主键我们一般都是自增长的,此时就会出现我们可以通过猜测这个参数进行恶意删除。嗯!此时有些人可能会想(也是几种解决方式):我可以通过对参数进行加密签名来

大家好,又见面了,我是你们的朋友全栈君。

开始前先大概的描述下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/aspnet/core/security/data-protection/using-data-protection?view=aspnetcore-5.0 。至于怎么集成到程序里面八仙过海各显神通了。下面贴下我的神通。

我用的是微软自带的序列化组件,至于Newtonsoft.Json只是API不同罢了,逻辑一样。自带序列化组件代码:

复制代码
public class ProtectionConverter : JsonConverter
{

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

复制代码

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

Newtonsoft.Json方式代码:

复制代码
///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)));
//    }
//}

复制代码

此处都是针对对象(POST居多)提交来数据加解密,如果非表单,对象提交咋办,

String key1=Request.Query[“key1”];//获取url字符串
String key2 = Request.Form[“key2”];//获取表单
上代码放在自定义管道和自定义过滤器里都可以。
有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523

学习视频资料:http://www.makeru.com.cn/live/1392_1164.html?s=143793

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133336.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【mysql】mysql删除重复记录并且只保留一条

    【mysql】mysql删除重复记录并且只保留一条目录一、单个字段的操作分组介绍:1.查询全部重复的数据:2.删除全部重复试题:3.查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)a.第一种方法:b.第二种方法:c.补充第三种方法(根据评论区给的删除总结出来的):4.删除表中多余重复试题并且只留1条:a.第一种方法:b.☆第二种方法(与上面查询的第二种方法对应,只…

  • Java:Eclipse下载安装教程,以及Eclipse 安装汉化包的方法[通俗易懂]

    Java:Eclipse下载安装教程,以及Eclipse 安装汉化包的方法[通俗易懂]Eclipse是目前最流行的Java语言开发工具,它强大的代码辅助功能,可以帮助开发人员自动完成语法修正、补全文字、代码修复、API提示等编码工作,大量节省程序开发所需的时间。本教程使用Eclipse为开发工具,下面介绍它的安装。(1)Eclipse是一个开放源代码的项目,其官方网站是www.eclipse.org。图1所示为Eclipse官方网站的首页。图…

  • JAVA协同过滤推荐算法

    1、什么是协同过滤在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被GroupLens用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。…

  • 新浪微博爬虫分享(一天可抓取 1300 万条数据)「建议收藏」

    From:https://blog.csdn.net/bone_ace/article/details/50903178微博爬虫单机每日千万级的数据微博爬虫总结:https://blog.csdn.net/nghuyong/article/details/81251948Python爬虫——新浪微博(网页版):https://blog.csdn.net/qq_37267015/ar…

  • IPSec配置与实验

    IPSec配置与实验

  • oracle的rac集群详解_Oracle rac

    oracle的rac集群详解_Oracle racORACLERAC数据库服务器上srvctl常用的一些操作命令,检查节点状态,检查VIP状态及配置等.作为笔记,以备不时之需.srvctl是ORACLERAC集群配置管理的工具,通过srvctl这个强大的工具来管理RAC,以下为对srvctl命令使用总结.检查节点应用程序状态[grid@db1~]$srvctlstatusnodeappsVIPdb1vipisenabl…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号