【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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇