2

我正在一个资产管理网站上工作,每当向用户发布资产时,系统都会发送一封电子邮件通知,其中包含一个 URL,该 URL 将向用户显示所有发给他的资产。我本可以使用查询字符串来传递用户 ID,但人们可能再次滥用它来查看发给其他用户的资产。我的客户不希望用户在单击链接时进行身份验证。所以我需要一些东西来隐藏在查询字符串中传递的参数,或者至少让它们变得模糊。我已经阅读了有关 url 编码、GUID 等的信息,但我不确定该怎么做。我只是一个初学者。请原谅我的无知并指出我正确的方向。

4

4 回答 4

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和用它来查看链接是否已经过期......

于 2012-06-06T15:42:52.007 回答
0

对于模糊 URL 参数,您需要使用修改后的 Base64 编码。请记住,模糊性不是安全性,Base64 编码不会以任何方式确保任何安全性。

如果您打算将其用于身份验证目的,我认为您应该重新考虑。研究公钥加密和数字签名作为起点。

于 2012-06-06T15:30:32.677 回答
0

试图保护对 URL 的访问不是正确的方法。自由地提供网址并验证您的用户。

我还强烈建议使用 SSL 来提供这些数据。

一旦模糊性不再模糊,通过模糊性实现的安全性就会 100% 失败。

于 2012-06-06T15:41:13.130 回答
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];
于 2012-06-06T16:00:46.213 回答