一个asp.net开发的公司内部系统URL问题

修改一下昵称 2012-01-17 10:18:19
情况是这样的。系统现在是稳定的上线了,但是发现一些用户自己随便修改url后面的参数进入页面操作。比如
URL是:Default.aspx?Type=Edit&ID=2012。
有什么方法防止呢,我想到的是URL加密.
但是程序里面都是用 Page.Request.QueryString或者用Page.Request.QueryString.Get("")这两个方法。
加密了,肯定获取参数时,要解密。
难道 重写 QueryString 和它的Get方法吗?

大家给个好点的方案..
...全文
231 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycproc 2012-01-17
  • 打赏
  • 举报
回复
京东 QQ空间 什么的很多地方都是明文

分两种
1.在于你传递的是什么类型的数据,涉及到很隐私的就加密
2.页面的权限判断
孟子E章 2012-01-17
  • 打赏
  • 举报
回复
无需加密,重要的是你需要对操作的页面进行权限的验证,看是否对这个id有操作的权限
修改一下昵称 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 findcaiyzh 的回复:]

仔细想想是需要加密(encrypt)还是需要校验(validate)
[/Quote]
是的,我觉得这个实现要简单些,主要是针对不要修改大部分的代码.

[Quote=引用 8 楼 yan267 的回复:]
....
[/Quote]
就是只修改小部分的代码,每个aspx页面都继承了一个公共父类,能在这个父类里面做些什么能实现就好,
或者像13说的,用httphandler ,但是这个具体怎么去实现?
zhujiazhi 2012-01-17
  • 打赏
  • 举报
回复
加密解密的方法 我倒是知道,但是我现在怎么只要修改一个地方,整个程序的url都得以加密.而且获取url参数时 也是得到正确的参数.

想要获取url还是正确的,可以用一层httphandler进去拦截,在这个handler里面进行解密,然后再转发一下,其它页面就可以正常获取了

至于整个url加密,估计就得有一个专门产生url 的地方了
joyhen 2012-01-17
  • 打赏
  • 举报
回复
至于加密措施,可以加也可以不加,个人觉得没必要的,url后面的参数本来就是个变数(特定标记参数),不让人修改干嘛呢
joyhen 2012-01-17
  • 打赏
  • 举报
回复
楼主要写几个方法(下面的可以合并,至于是form还是QueryString自己看):
1.url是否静态化,比如csdn的帖子生成,用的是自定义模板,但也有规则
http://topic.csdn.net/u/20120117/10/5eecf9b4-6215-42fc-8d85-454444c85d0b.html?1129
2.request对象检查(是否存在)
3.request对象的合法性(多少、过滤特殊、非法字符什么的)
宝_爸 2012-01-17
  • 打赏
  • 举报
回复
仔细想想是需要加密(encrypt)还是需要校验(validate)
全局变量 2012-01-17
  • 打赏
  • 举报
回复
你可以用伪静态的那种方式,把你要加密解密 在UrlRewriter 所有请求都经过这里,在解析成你要的URL
yan267 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yhb417 的回复:]
引用 6 楼 yan267 的回复:

C# code

#region DES 加密/解密

private static byte[] key = ASCIIEncoding.ASCII.GetBytes("99999999");
private static byte[] iv = ASCIIEncoding.ASCII.GetBytes("11111111");



……
[/Quote]

只修改一个地方的代码。。。。。
修改一下昵称 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yan267 的回复:]

C# code

#region DES 加密/解密

private static byte[] key = ASCIIEncoding.ASCII.GetBytes("99999999");
private static byte[] iv = ASCIIEncoding.ASCII.GetBytes("11111111");





/……
[/Quote]
加密解密的方法 我倒是知道,但是我现在怎么只要修改一个地方,整个程序的url都得以加密.而且获取url参数时 也是得到正确的参数.
yan267 2012-01-17
  • 打赏
  • 举报
回复

#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传值的信息是否允许当前用户查看,再显示信息。
bleach001 2012-01-17
  • 打赏
  • 举报
回复
目前我想到的也就是生成随机数验证一下
mcycsnd007 2012-01-17
  • 打赏
  • 举报
回复
你可以对url做下编码 对于一般用户他们就不明白了
对于某些页面 你可以多加个参数 生成随机数 过期不候
我推荐的方式
进行权限验证 不同用户进入不同的页面 根据角色权限进行验证 改了也进不去 或者数据无效
宝_爸 2012-01-17
  • 打赏
  • 举报
回复
我觉得加密没有判断范围好。

判断下参数,如果超过范围,就提示错误呗。


Im_Sorry 2012-01-17
  • 打赏
  • 举报
回复
如果你后台参数是固定的,那你可以用switch() 来限制,必须规定可以参数才可以通过,


如果是不固定的,那还真的....
二当家 2012-01-17
  • 打赏
  • 举报
回复
Edit 2012 重要就加密 不重要就明码
参见淘宝 查询
ltcszk 2012-01-17
  • 打赏
  • 举报
回复
"showtimeList"
这个属性不就是加载的数据吗?
直接对其分析不就好了
ltcszk 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yhb417 的回复:]

不止是简单的权限控制的,权限本来就有控制,
但是权限控制的是针对某个功能有没有增删改查功能的问题,

但是针对某个订单的状态到了一定程度,按正常的程序连接是,访问不了的,但是知道最终的编辑页面直接输入url就可以操作 了,还有很多类似的情况。 所以这时URL加密就很有必要。
[/Quote]
既然正常的程序是访问不了的,那么没有权限进入这个页面时就应该直接弹出警告禁止其访问,而不是对url加密
herott632482577 2012-01-17
  • 打赏
  • 举报
回复
加个密被 在弄个错误页~~~
yan267 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yhb417 的回复:]
引用 10 楼 findcaiyzh 的回复:

仔细想想是需要加密(encrypt)还是需要校验(validate)

是的,我觉得这个实现要简单些,主要是针对不要修改大部分的代码.


引用 8 楼 yan267 的回复:
....

就是只修改小部分的代码,每个aspx页面都继承了一个公共父类,能在这个父类里面做些什么能实现就好,
或者像13说的,用httphandle……
[/Quote]

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; }
}


}
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧