情况是这样的。系统现在是稳定的上线了,但是发现一些用户自己随便修改url后面的参数进入页面操作。比如
URL是:Default.aspx?Type=Edit&ID=2012。
有什么方法防止呢,我想到的是URL加密.
但是程序里面都是用 Page.Request.QueryString或者用Page.Request.QueryString.Get("")这两个方法。
加密了,肯定获取参数时,要解密。
难道 重写 QueryString 和它的Get方法吗?大家给个好点的方案..
URL是:Default.aspx?Type=Edit&ID=2012。
有什么方法防止呢,我想到的是URL加密.
但是程序里面都是用 Page.Request.QueryString或者用Page.Request.QueryString.Get("")这两个方法。
加密了,肯定获取参数时,要解密。
难道 重写 QueryString 和它的Get方法吗?大家给个好点的方案..
解决方案 »
- 一个时间的问题,高手进吧
- .NET 怎样将一段前台代码封装成类供各页面调用
- 关于asp.net中,多线程同步的问题。。。希望高手赐教
- 特急!!!关于 怎样编程动态在panel中添加组件的问题
- 求教高手,时间控制问题,急呀!
- 用C#1.1版怎样实现AD登陆验证?急急急急急急|请高手帮忙
- 如何得到 Sql数据库中所有表名,和字段属性以及字段说明信息;谢谢!!!有简单说明,在线等;
- 无法获取COOKIE的值
- 想学javascript,提供优秀的电子书籍下载!!(在线给分)
- 用datagrid怎么接收和显示数据库表中的行数据?
- ASP.NET模板引擎技术方面的问题
- SQLSERVER 导致CPU 100%怎么解决!
参见淘宝 查询
如果是不固定的,那还真的....
对于某些页面 你可以多加个参数 生成随机数 过期不候
我推荐的方式
进行权限验证 不同用户进入不同的页面 根据角色权限进行验证 改了也进不去 或者数据无效
#region DES 加密/解密 private static byte[] key = ASCIIEncoding.ASCII.GetBytes("99999999");
private static byte[] iv = ASCIIEncoding.ASCII.GetBytes("11111111"); /// <summary>
/// DES加密。
/// </summary>
/// <param name="pToEncrypt">输入字符串。</param>
/// <returns>加密后的字符串。</returns>
public static string DESEncrypt(string pToEncrypt)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中 byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt); des.Key = key; //建立加密对象的密钥和偏移量
des.IV = iv; //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
MemoryStream ms = new MemoryStream(); //使得输入密码必须输入英文文本
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
} /// <summary>
/// DES解密。
/// </summary>
/// <param name="pToDecrypt">输入字符串。</param>
/// <returns>解密后的字符串。</returns>
public static string DESDecrypt(string pToDecrypt)
{
//MemoryStream ms = null;
//CryptoStream cs = null;
//StreamReader sr = null; //DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//try
//{
// ms = new MemoryStream(Convert.FromBase64String(inputString));
// cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
// sr = new StreamReader(cs);
// return sr.ReadToEnd();
//}
//finally
//{
// if (sr != null) sr.Close();
// if (cs != null) cs.Close();
// if (ms != null) ms.Close();
//} try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
} des.Key = key; //建立加密对象的密钥和偏移量
des.IV = iv; //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象 return System.Text.Encoding.Default.GetString(ms.ToArray());
}
catch (Exception)
{
//throw;
return "";
}
} #endregion
}
加密参数。不过要真正的安全就要做好权限。例如判断ID传值的信息是否允许当前用户查看,再显示信息。
1.url是否静态化,比如csdn的帖子生成,用的是自定义模板,但也有规则
http://topic.csdn.net/u/20120117/10/5eecf9b4-6215-42fc-8d85-454444c85d0b.html?1129
2.request对象检查(是否存在)
3.request对象的合法性(多少、过滤特殊、非法字符什么的)
或者像13说的,用httphandler ,但是这个具体怎么去实现?
但是权限控制的是针对某个功能有没有增删改查功能的问题,但是针对某个订单的状态到了一定程度,按正常的程序连接是,访问不了的,但是知道最终的编辑页面直接输入url就可以操作 了,还有很多类似的情况。 所以这时URL加密就很有必要。
--------------------------------------------
页面没有设置权限和url参数没关系
URL重写只能帮你减少解密的代码。
加密的都还是要写的。
URL重写继承
web.config
<add type="URLRewriter" name="HttpModule"/>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;/// <summary>
///URLRewriter 的摘要说明
/// </summary>
public class URLRewriter : System.Web.UI.Page, IHttpModule
{
public URLRewriter()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.ReUrl_BeginRequest);
context.EndRequest += new EventHandler(this.ReUrl_EndRequest);
}
private void ReUrl_BeginRequest(object sender, EventArgs e)
{
HttpContext Context = ((HttpApplication)sender).Context;
Context.Response.Buffer = true;
Context.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1.0);
Context.Response.Expires = 0;
Context.Response.CacheControl = "no-cache";
_url = Context.Request.Url.ToString().ToLower();
_url = _url.Replace("localhost", "111111.axpx");
// string urlquest = Context.Request.Url.Query;
// string url = Context.Request.Url.AbsolutePath; Context.Response.Redirect(_url);
}
public void Dispose()
{
} protected string _url = "";
protected string strUrl
{
get { return _url; }
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void ReUrl_EndRequest(object sender, EventArgs args)
{ }
/// <summary>
///
/// </summary>
/// <param name="Context"></param>
public void ProcessRequest(HttpContext Context)
{
}
/// <summary>
/// 实现“IHttpHandler”接口所必须的成员
/// </summary>
/// <value></value>
public bool IsReusable
{
get { return false; }
}
}
这个属性不就是加载的数据吗?
直接对其分析不就好了