Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.MVC当URL跳转时候参数的安全性

ASP.MVC当URL跳转时候参数的安全性

作者头像
用户1055830
发布于 2018-01-18 07:55:12
发布于 2018-01-18 07:55:12
1.4K00
代码可运行
举报
文章被收录于专栏:飞扬的花生飞扬的花生
运行总次数:0
代码可运行

      一个页面跳转到另外一个页面直接将参数写在URL上面并不安全比如 http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bFgIBMPG37WjWMXpqY

参数id和uid需要进行加密,写个简单的例子来实现:

加密类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace CnbLogsProject.Util
{
    public class EnCodeHelper
    {
        // url传输参数加密密钥
        public static string strKeys = "abdfajrtrgjfg";

        #region 加密字符串
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="strValue"></param>
        /// <returns></returns>
        public static string GetEncryption(string strValue)
        {
            //加密标准算法的对象
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
            //建立加密对象的密钥和偏移量
            provider.Key = Encoding.ASCII.GetBytes(strKeys.Substring(0, 8));
            //原文使用Encoding.ASCII方法的GetBytes方法
            provider.IV = Encoding.ASCII.GetBytes(strKeys.Substring(0, 8));
            //将要加密的字符放到byte数组中
            byte[] bytes = Encoding.UTF8.GetBytes(strValue);
            //输入的文本必须是英文文本
            MemoryStream stream = new MemoryStream();
            //定义将数据连接到加密转换的流
            CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
            stream2.Write(bytes, 0, bytes.Length);//将当前字节写入到流中
            stream2.FlushFinalBlock();//清除缓存区
            StringBuilder builder = new StringBuilder();
            //循环遍历每个字节
            foreach (byte num in stream.ToArray())
            {
                builder.AppendFormat("{0:X2}", num);
            }
            stream.Close();//关闭释放资源
            return builder.ToString();
        }
        #endregion

        #region 解密字符串
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="strValue"></param>
        /// <returns></returns>
        public static string GetDecryption(string strValue)
        {
            //解密标准算法的对象
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
            //建立解密密对象的密钥和偏移量
            provider.Key = Encoding.ASCII.GetBytes(strKeys.Substring(0, 8));
            //原文使用Encoding.ASCII方法的GetBytes方法
            provider.IV = Encoding.ASCII.GetBytes(strKeys.Substring(0, 8));
            //将要解密的字符放到byte数组中
            byte[] buffer = new byte[strValue.Length / 2];
            //循环遍历遍历
            for (int i = 0; i < (strValue.Length / 2); i++)
            {
                int num2 = Convert.ToInt32(strValue.Substring(i * 2, 2), 0x10);
                buffer[i] = (byte)num2;
            }
            //输入的文本必须是英文文本
            MemoryStream stream = new MemoryStream();
            //定义将数据连接到解密转换的流
            CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
            //将当前字节写入到流中
            stream2.Write(buffer, 0, buffer.Length);
            stream2.FlushFinalBlock();//清除缓存区
            stream.Close();//关闭释放资源
            return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());
        }
        #endregion
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strKeys 为秘钥可以写在配置文件里面控制器(将A页面的参数加密后暴露给客户端跳转到B页面时候解密):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     /// <summary>
        /// A页面
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            string id = "5381";
            string uid = "o0En_sj1J0bFgIBMPG37WjWMXpqY";
            id = EnCodeHelper.GetEncryption(id);
            uid = EnCodeHelper.GetEncryption(uid);

            ViewBag.id = id;
            ViewBag.uid = uid;
            return View();
        }


        /// <summary>
        /// B页面
        /// </summary>
        /// <param name="id"></param>
        /// <param name="uid"></param>
        /// <returns></returns>
        public ActionResult Home(string id="",string uid="")
        {
            ViewBag.id =EnCodeHelper.GetDecryption(id);
            ViewBag.uid =EnCodeHelper.GetDecryption(uid);
            return View();
        }

视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<button id="re">跳转</button>
<script>

    $(function () {

        $("#re").click(function () {
            location.href = "Home?id="+"@ViewBag.id"+"&uid="+"@ViewBag.uid";
        });
    });
</script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    ViewBag.Title = "Home";
}

<input value="@ViewBag.id" />
<input value="@ViewBag.uid"/>
<h2>Home</h2>

效果:

原来的URL:http://localhost:63792/Home/Home?id=282D147B1B12BAE3&uid=29732D957DD4EF753BC3E94797D1018D230457174ABD43EF1ED2FEA651E8351E

跳转到B页面后成功解密:

对应上我们开头的

http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bFgIBMPG37WjWMXpqY

参数id和uid需要进行加密,写个简单的例子来实现:

当然还有其他很多方法 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3des算法源码
using System; using System.Text; using System.IO; using System.Security.Cryptography; class Class1 { static void Main() {   Console.WriteLine("Encrypt String...");   txtKey = "tkGGRmBErvc=";   btnKeyGen();   Console.WriteLine("Encrypt Key :{0}",txtKey);   txtIV = "Kl7ZgtM1dvQ=";   btnIVGen();   Console.WriteLine("Encrypt IV :{0}",txtIV);   Console.WriteLine();   string txtEncrypted = EncryptString("1111");   Console.WriteLine("Encrypt String : {0}",txtEncrypted);   string txtOriginal = DecryptString(txtEncrypted);   Console.WriteLine("Decrypt String : {0}",txtOriginal); } private static SymmetricAlgorithm mCSP; private static string txtKey; private static string txtIV; private static void btnKeyGen() {   mCSP = SetEnc();   byte[] byt2 = Convert.FromBase64String(txtKey);   mCSP.Key = byt2; } private static void btnIVGen() {   byte[] byt2 = Convert.FromBase64String(txtIV);   mCSP.IV = byt2; } private static string EncryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);   byt = Encoding.UTF8.GetBytes(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Convert.ToBase64String(ms.ToArray()); } private static string DecryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);   byt = Convert.FromBase64String(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Encoding.UTF8.GetString(ms.ToArray()); } private static SymmetricAlgorithm SetEnc() {   return new DESCryptoServiceProvider(); } } 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 3
py3study
2020/01/10
7150
dotnet MD5
MD5 加密解密算法 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Watch { class DES { // 创建Key public strin
sofu456
2020/05/04
8460
[C#] 常用工具类——加密解密类
using System; using System.Configuration; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.
跟着阿笨一起玩NET
2018/09/19
1.6K0
Md5加密秘钥加密哈希加密
加密通用类: public class EncryptClass { /// <summary> /// 返回MD5加密字符串 /// </summary> /// <param name="EncString"></param> /// <returns></returns> public static string GetMd5String(string EncString)
用户1055830
2018/01/18
6.2K1
c#通用登录模块,简单好用,一贴见效
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统 //可以分3个userType, user ,shop , system //网站后台一般都有角色,如admin,employee //那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system) 使用方法: 1、添加一个类LoginUser.cs 代码如下: 代码: namespace MVCCommonAut
阿炬
2018/05/11
1.1K2
DotNet中几种常用的加密算法
彭泽0902
2018/01/04
7770
Asp.Net 加密解密
#region DES加密解密 /// <summary> /// DES加密 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="key">32位Key值</param> /// <returns>加密后的字符串</returns> public string DESEncrypt(string strSource) { return DESEncrypt(strSource, DESKey); } public string DESEncrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write); byte[] byt = Encoding.Unicode.GetBytes(strSource); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } /// <summary> /// DES解密 /// </summary> /// <param name="strSource">待解密的字串</param> /// <param name="key">32位Key值</param> /// <returns>解密后的字符串</returns> public string DESDecrypt(string strSource) { return DESDecrypt(strSource, DESKey); } public string DESDecrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; ICryptoTransform ct = sa.CreateDecryptor(); byte[] byt = Convert.FromBase64String(strSource); MemoryStream ms = new MemoryStream(byt); CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Read); StreamReader sr = new StreamReader(cs, Encoding.Unicode); return sr.ReadToEnd(); }
用户8671053
2021/11/02
2.2K0
C#封装的DES加密、解密类代码
这个C#类封装的DES加密解密,可以使用默认秘钥进行加密、解密,也可以自定义秘钥进行加密、解密,调用简单方便。
用户7108768
2021/11/03
1.4K0
C#笔记:RC6算法实现
public class RC6Cryptor     {         public byte[] Encrypt(byte[] data, string pwd)         {             SymmetricAlgorithm sa = Rc6.Create();             //             byte[] inputByteArray = data;//得到需要加密的字节数组             //设置密钥及密钥向量             sa.Ke
超级大猪
2019/11/22
1.3K0
3DES 加密与解密
/// <summary>     /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码)     /// </summary>     public class Crypto3DES     {         /// <summary>         /// 默认密钥         /// </summary>         private string Keys;         /// <summary>         /// 密钥与加密字符串
用户1220053
2018/02/09
2.2K0
【Unity3D】存档文件加密代码
存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs
py3study
2020/01/08
5590
快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了。在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.Net.Http程序集非常的丰富,而老版本的则相对较弱。在WebAPI v1.0(和ASP.NET MVC4在一起的版本)很多的类和接口并不存在,同时对Task异步编程(ApiController默认提供异步执行方法)的支持还有一些欠缺(缺少不少方便的扩展方法),在使用时会有一些需要注意的地方,由于一些老的项目用
用户1216676
2018/01/24
1.1K0
那些常用的加密算法
MD5加密是最常见的加密方式,因为MD5是不可逆的,所以很多系统的密码都是用MD5加密保存的。
Kiba518
2020/11/26
1.2K0
那些常用的加密算法
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明文暴露,需要进行一些加密手段! 加密主要分几类:对称加密,非对称加密,散列算法(自己百度脑补,这里不再多说) 我这里选择AES 256位的加密,主要加密速度算法快,安全性高,资源消耗低。 公司一直在使用AES加密来加密一些小数据量的数据,比较方法和安全   这是我选择加密AES的理由,当然你可以选择其他有名的加密
用户1149182
2018/01/16
1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
C#笔记:RC4算法实现
public class RC4Cryptor     {                 public byte[] Encrypt(byte[] data, string pwd)         {             SymmetricAlgorithm sa = RC4Creator.Create(); ;             //             byte[] inputByteArray = data;//得到需要加密的字节数组             //设置密钥及密钥
超级大猪
2019/11/21
1.6K0
开始开源项目OpenTools的创作
前言:开始开源项目的创作。目的是开发一系列方便大家拿来即可使用的工具集合,希望能够让.net的生态更加丰富。该项目采用MIT开源。并且如果引用nuget包,该项目可以兼容.net framework4.6.1以及以上的所有.nrt framework以及所有.net core或以上环境的所有.net版本。
Wesky
2024/08/13
1450
开始开源项目OpenTools的创作
C#对字符串进行加密解密
明志德道
2023/10/21
4290
C#对字符串进行加密解密
.net core建站踩坑记录
services.AddOptions(); services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
易墨
2018/09/14
9490
.net core建站踩坑记录
文本的DES加密 MD5散列值 DSA的数字签名
作者:未知文本的DES加密为了对称加密的安全,将密码进行封装,先新建一个用于保存密码的类库cl:usC#
Java架构师必看
2020/10/26
7930
【愚公系列】2023年03月 MES生产制造执行系统-001.Autofac的使用
IoC容器是一种设计模式,它可以管理应用程序中的对象依赖关系。它可以自动创建和注入对象,从而减少了代码的耦合度和重复性。
愚公搬代码
2023/03/16
5030
【愚公系列】2023年03月 MES生产制造执行系统-001.Autofac的使用
相关推荐
3des算法源码
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验