我正在开发一个资产管理网站,无论何时向用户发放资产,系统都会发送一封电子邮件通知,其中包含一个网址,用于向用户显示发给他的所有资产。我本可以使用查询字符串来传递用户ID,但是人们可能会滥用它来查看发给其他用户的资产。我的客户端不希望用户在单击链接时进行身份验证。所以我需要隐藏在查询字符串中传递的参数或者至少使它们模糊不清的东西。我已经阅读了关于url编码,GUID等但我不知道该怎么做。我只是个初学者。请原谅我的无知并指出我正确的方向。
答案 0 :(得分:6)
采取你所说的,你只是一个初学者,并假设这将是公开的,你可以做最简单的方式:
在数据库中创建一个新表,并调用示例tbl_links
,因为列只添加3
user_id (foreigner key to the user table)
guid (primary key, unique)
settings (nvarchar(250)
当您需要发送电子邮件时,请为该用户创建一个新行,例如:
Guid guid = Guid.New();
String settings = "date_from:2012/01/01;date_to:2013/01/01";
在数据库中插入一个数据库,你在电子邮件中放置的链接应该有guid,例如http://domain.com/info/?g= ....
你可以将Json附加到settings
列并在代码中再次将其解析为一个对象,如果你想采用这条路线,可以提出一个新问题。
我个人使用安全算法只传递user_id
,但你确实说过你是初学者,所以我只向你展示了简单而有效的方法。
PS 出于安全原因,您应该在电子邮件中说明您的链接仅在接下来的4个小时左右有效,您可以阻止人们生成GUID以尝试获取某些信息。 ...简单添加create_date
类型的datetime
列,并使用它来查看链接是否已过期...
答案 1 :(得分:0)
要隐藏网址参数,您需要使用modified Base64 encoding。请记住,默默无闻不是安全性,Base64编码的东西绝不会使任何安全。
如果您打算将此用于身份验证,我认为您应该重新考虑。以公钥加密和数字签名为出发点。
答案 2 :(得分:0)
尝试保护对URL的访问权限不是正确的方法。免费提供网址并改为对用户进行身份验证。
我还强烈建议使用SSL来提供这些数据。
一旦隐匿性不再模糊,通过默默无闻的安全性会100%失效。
答案 3 :(得分:0)
您可以做的是为id添加一些前缀和后缀以及加密该字符串。像这样:
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
static public string DecodeFrom64(string encodedData)
{
byte[] encodedDataAsBytes
= System.Convert.FromBase64String(encodedData);
string returnValue =
System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
return returnValue;
}
string prefix = "lhdsjñsdgñdfj";
string suffix = "dfknsfñn3ih";
var strToEncode = prefix + "|" + id + "|" + suffix;
var encoded = EncodeTo64(str);
var decoded = DecodeFrom64(encoded).Split('|');
if( decoded.length != 3 || decoded[0] != prefix || decoded[2] != suffix )
throw new InvalidArgumentException("id");
var decodedId = decoded[1];