【C#】网址不进行UrlEncode编码会存在一些问题

2024-01-06 00:44

本文主要是介绍【C#】网址不进行UrlEncode编码会存在一些问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎来到《小5讲堂》,大家好,我是全栈小5。
这是2024年第3篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • 数据丢失
    • 效果
    • 请求端代码
    • 接口端代码
  • 数据编码
    • 效果
    • 请求端代码
    • 接口端代码
  • 防止攻击

前言

上篇文章,我们已经了解到如果不进行地址编码,会存在数据丢失或者数据不正确的情况。
至于URL错误和安全问题,以及兼容性问题暂不做探索,这里只通过不编码解析情况探索。

数据丢失

这个比较好理解,就是传递过去的地址参数值不全,只有部分,另一部分数据丢失的情况。
下面将演示A地方发起http地址的get请求,传递未编码的地址参数,在目标接口接收到参数值的效果

效果

假设地址参数为:name=张三&小明&age=20&21
完整请求地址为:https://localhost:7250/WeatherForecast?name=张三&小明&age=20&21

在这里插入图片描述
在这里插入图片描述
地址参数中的&与符号是用来分隔不同参数变量,=等于符号后面是参数值。

从上图可以看到name参数的值应该是张三&小明,age参数的值应该是20&21,实际上获取到的值是name=张三,age=20。
原因就是地址参数的值就是从=等于号到下一个&符号结束,没有&符号就是=等于符号后面所有值。

因此,如果网址地址参数在通过http请求方式调用接口,不进行编码,就很有可能会丢失数据。

请求端代码

private async Task HttpGet()
{string urlValue = $"https://localhost:7250/WeatherForecast?name=张三&小明&age=20&21";using (HttpClient client = new HttpClient()){try{HttpResponseMessage response =await client.GetAsync(urlValue);response.EnsureSuccessStatusCode(); // 确保请求成功,否则会抛出异常string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine(responseBody);}catch (HttpRequestException ex){Console.WriteLine($"请求失败:{ex.Message}");}}
}

接口端代码

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get(string name, int age)
{string urlParam = Request.QueryString.Value;return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

数据编码

使用HttpUtility.UrlEncode进行数据编码

效果

从下图可以知道,.net core mvc框架本身会自动对编码数据进行解码
在这里插入图片描述
在这里插入图片描述

请求端代码

编码后数据,编码后发现无法调用到接口,那是因为接口age参数接收的是整型数据,因为框架有自己规则,所以需要改为字符串类型

https://localhost:7250/WeatherForecast?name=%e5%bc%a0%e4%b8%89%26%e5%b0%8f%e6%98%8e&age=20%2621

private async Task HttpGet()
{string urlValue = $"https://localhost:7250/WeatherForecast?name={HttpUtility.UrlEncode("张三&小明")}&{HttpUtility.UrlEncode("age=20&21")}";using (HttpClient client = new HttpClient()){try{HttpResponseMessage response =await client.GetAsync(urlValue);response.EnsureSuccessStatusCode(); // 确保请求成功,否则会抛出异常string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine(responseBody);}catch (HttpRequestException ex){Console.WriteLine($"请求失败:{ex.Message}");}}
}

接口端代码

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get(string name, string age)
{string urlParam = Request.QueryString.Value;return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

防止攻击

地址参数发起是在攻击者,他可以进行不编码传递,这个怎么防止攻击,可以采用以下措施。

1.进行输入检查和过滤
在服务端对传递的地址参数进行检查和过滤,以确保它们符合预期格式、类型、范围和规则。例如,可以检查参数是否是合法的URL或者做一定的输入数据格式的限制。

2.对地址参数进行编码
对地址参数进行URL编码或其他适合的编码,以确保传递的数据是安全的且不会被攻击者利用。

3.使用HTTPS协议进行数据传输
使用HTTPS协议加密数据传输,可以通过传输层或者网络层的加密来确保连接的安全性,可以有效防止数据的中途被中间人攻击窃取,提高防护能力。

4.避免在URL中传递敏感数据
避免在地址参数中传递敏感的数据,比较敏感的数据最好在进行传递时是采用POST方式进行,不要采用GET的方式。

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

这篇关于【C#】网址不进行UrlEncode编码会存在一些问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574673

相关文章

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础