地址栏传参不安全的解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了地址栏传参不安全的解决方案相关的知识,希望对你有一定的参考价值。
地址栏传递参数,比如 ?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 = Guid.NewGuid().ToString();
HttpCookie ch = new HttpCookie("safeMark");
ch.Value = 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;
}
}
|
以上是关于地址栏传参不安全的解决方案的主要内容,如果未能解决你的问题,请参考以下文章
java 求助:如何解决地址栏传参数为中文文件路径时 乱码的情况?