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

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

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

加密类:

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
    }
}
strKeys 为秘钥可以写在配置文件里面控制器(将A页面的参数加密后暴露给客户端跳转到B页面时候解密):
     /// <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();
        }

视图:

@{
    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>
@{
    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需要进行加密,写个简单的例子来实现:

当然还有其他很多方法 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

希尔排序

希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。 算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。...

22150
来自专栏阿炬.NET

VB2008写的--收藏夹查看程序,适合.net初学者研究(附源码)

35850
来自专栏Golang语言社区

go语言中json转成map结构

package main import ( "encoding/json" "fmt" ) //把请求包定义成一个结构体 type Reques...

32960
来自专栏更流畅、简洁的软件开发方式

基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)

好久没发帖子了,又加了不少的功能呀。(图片仅是测试,不代表什么表情。) 本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关...

20250
来自专栏木宛城主

庖丁解牛——深入解析委托和事件

这篇博文我不讲委托和事件的概念,因为大段的文字概念没有任何意义。 具体想了解,委托和事件的概念可以MSDN查阅。 我这篇文章的主题思路是委托如何一步步进化...

493100
来自专栏Pythonista

Golang实现一个密码生成器

21530
来自专栏游戏杂谈

关于AS3的事件移除释疑

as3.0中的事件Event(位于包flash.events内,继承至Object,子类有…)

12220
来自专栏互联网杂技

js事件

1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body...

420110
来自专栏行者常至

013.反射reflection

7010
来自专栏Golang语言社区

Go语言中json转成map结构

package main import ( "encoding/json" "fmt" ) //把请求包定义成一个结构体 type Reques...

32950

扫码关注云+社区

领取腾讯云代金券