首页 > 代码库 > 地址栏传参不安全的解决方案

地址栏传参不安全的解决方案

 地址栏传递参数,比如    ?uid=45  
 那么,用户就可以修改45位其他值,就会获取到其他的信息。很不安全;

解决方案方法:    可逆加密 + GUID + cookie

单纯的加密,比如  要传45这个参数,加密成了  abcd(假如),但是人家只要看到abcd,那个之后别人想看45的信息,输入abcd参数即可。还是有安全隐患;

可行方案
浏览器在需要的地方(或者登陆的时候就行),生成一个全球唯一标示GUID,之后存在 cookie里面。
那么在需要传递参数的地方,把这个GUID从cookie中取出来,和要传递的参数   uid=45 拼接起来。之后使用一个可逆加密。传参,接受参数的地方,解密,再根据cookie来replace掉不用的guid就可以  安全的获取数据了。并且换个浏览器同样第uid=45,但是地址栏的参数都会不同。所以,被别人赋值了参数也不会不安全。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;
 
/// <summary>
///SafetyHelp 的摘要说明
/// </summary>
public class SafetyHelp
{
    public SafetyHelp()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
 
    //设置获取系统url参数的安全标示代码
    public static string SetAndGetSafeMark()
    {
        //安全标记志
        if (System.Web.HttpContext.Current.Request.Cookies["safeMark"] == null)
        {
            string guidValue = http://www.mamicode.com/Guid.NewGuid().ToString();
            HttpCookie ch = new HttpCookie("safeMark");
            ch.Value = http://www.mamicode.com/guidValue;
            System.Web.HttpContext.Current.Response.Cookies.Add(ch);
            return System.Web.HttpContext.Current.Response.Cookies["safeMark"].Value;
        }
        else
        {
            return System.Web.HttpContext.Current.Request.Cookies["safeMark"].Value;
        }
    }
 
 
 
 
    //默认密钥向量
    private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    /// <summary>
    /// DES加密字符串
    /// </summary>
    /// <param name="encryptString">待加密的字符串</param>
    /// <param name="encryptKey">加密密钥,要求为8位</param>
    /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
    public static string EncryptDES(string encryptString, string encryptKey)
    {
        try
        {
            byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
            byte[] rgbIV = Keys;
            byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
            DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
            MemoryStream mStream = new MemoryStream();
            CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            cStream.Write(inputByteArray, 0, inputByteArray.Length);
            cStream.FlushFinalBlock();
            return Convert.ToBase64String(mStream.ToArray());
        }
        catch
        {
            return encryptString;
        }
    }
 
    /// <summary>
    /// DES解密字符串
    /// </summary>
    /// <param name="decryptString">待解密的字符串</param>
    /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
    /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
    public static string DecryptDES(string decryptString, string decryptKey)
    {
        try
        {
            byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
            byte[] rgbIV = Keys;
            byte[] inputByteArray = Convert.FromBase64String(decryptString);
            DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
            MemoryStream mStream = new MemoryStream();
            CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            cStream.Write(inputByteArray, 0, inputByteArray.Length);
            cStream.FlushFinalBlock();
            return Encoding.UTF8.GetString(mStream.ToArray());
        }
        catch
        {
            return decryptString;
        }
    }
 
 
 

 

地址栏传参不安全的解决方案