我正在一个资产管理网站上工作,每当向用户发布资产时,系统都会发送一封电子邮件通知,其中包含一个 URL,该 URL 将向用户显示所有发给他的资产。我本可以使用查询字符串来传递用户 ID,但人们可能再次滥用它来查看发给其他用户的资产。我的客户不希望用户在单击链接时进行身份验证。所以我需要一些东西来隐藏在查询字符串中传递的参数,或者至少让它们变得模糊。我已经阅读了有关 url 编码、GUID 等的信息,但我不确定该怎么做。我只是一个初学者。请原谅我的无知并指出我正确的方向。
4 回答
采取你所说的,你只是一个初学者,并假设这将是公开的,你可以做最简单的方法:
在您的数据库中创建一个新表并调用例如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
和用它来查看链接是否已经过期......
对于模糊 URL 参数,您需要使用修改后的 Base64 编码。请记住,模糊性不是安全性,Base64 编码不会以任何方式确保任何安全性。
如果您打算将其用于身份验证目的,我认为您应该重新考虑。研究公钥加密和数字签名作为起点。
试图保护对 URL 的访问不是正确的方法。自由地提供网址并验证您的用户。
我还强烈建议使用 SSL 来提供这些数据。
一旦模糊性不再模糊,通过模糊性实现的安全性就会 100% 失败。
您可以做的是为 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];