为了打击投票欺诈,我需要在我的数据库中存储 IP 地址,但我想让它们匿名。我需要的唯一信息是两个地址是否相同......我想。
为了防止公共网站上的投票操纵,比较 IP 地址是否相等就足够了吗?
出于透明度/验证目的,我希望允许用户下载投票数据。因此,我必须以合适的方式散列 IP 地址。您建议使用哪种哈希方法,为什么?
为了打击投票欺诈,我需要在我的数据库中存储 IP 地址,但我想让它们匿名。我需要的唯一信息是两个地址是否相同......我想。
为了防止公共网站上的投票操纵,比较 IP 地址是否相等就足够了吗?
出于透明度/验证目的,我希望允许用户下载投票数据。因此,我必须以合适的方式散列 IP 地址。您建议使用哪种哈希方法,为什么?
我过去做过一些投票功能,我使用 IP 作为唯一约束。缺点是人们可能会共享公共 IP。
您可以结合使用 cookie 和 IP。如果人们在作弊,这完全取决于投票的重要性。
我会使用一个简单的 MD5 哈希。
比较公共 IP 是不够的。您将只允许来自少数几个国家和拥有一个外部 IP 的公司的一票。
最好的方法是使用多种方法来检测假票。
对于匿名 IP,只需制作 IP 的键控哈希。
为了防止公共网站上的投票操纵,比较 IP 地址是否相等就足够了吗?
一旦网关后面的人投票,这将阻止许多在 NAT 网关后面的人投票。你真的想这样做吗?
我会对 IP 地址进行哈希处理,并为每次投票保留一份已投票的人的哈希列表和答案列表。不要将答案与哈希结合起来。这样一来,你的散列到底有多好都没关系。
除了存储 ip 之外,您还可以考虑在客户端上放置一个 cookie,例如使用笔记本电脑的人,他们连接到不同的网络,从而能够从不同的 ip 投票。
还要意识到,通过允许 ip 投票一次,您允许 NAT 或代理后面的人投票一次。这可能意味着整个公司只能投票一次。你需要考虑你是否可以接受。
我认为防止投票欺诈的最佳方法是使用身份验证方法。但是您需要一些未经身份验证的公共网站。是的?
那么您的想法是对的,IP验证,将IP地址与哈希一起保存在一张表中。
// Verify in the table if this IP visitor exists
...
$ip = $_SERVER['REMOTE_ADDRESS'];
if ($ip == $row['ip']) {
if (sha1($ip) === '$row[shaip]') {
echo "You have already give a vote.";
}
}
else {
// Start the process here
$ip = "$_SERVER['REMOTE_ADDRESS']";
$shaip = sha1($ip); // the own IP
// Here inputs IP and HASH in your table
mysql_query("INSERT ...");
// Here fetch the data to comparison
mysql_query("SELECT ...");
}
使用公共盐进行散列显然不会保持 IP 的私密性(其中只有 40 亿个,很容易暴力逆向)。
所以你需要保持盐的私密性,此时它基本上变成了一个关键。因此,除了散列之外,您还可以使用像 AES 这样的对称加密,它也是一个密钥。并且不会有显着差异。除了您自己(谁拥有密钥)反转加密比反转哈希稍微容易一些。
您可以做的另一件事是使用明显短于 32 位的散列。这样一来,您就可以防止 IP 反转,因为有许多 IP 与单个哈希匹配。但当然,每次投票也会阻止许多其他 IP。是否可以接受取决于您的用例。