我有一个API,可以将网址发送到我网络上的重定向页面。网址看起来像这样:
http://mydomain.com/offers.php?country=US&offerID=5555
还有一些其他参数,但这就是它的主旨。问题是用户滥用它并使用机器人创建自己的点击。我想创建一个密钥系统,强制用户使用API中的链接,以免被滥用。
这样的事情:
api.php
<?php
$random_number=mt_rand(1,100);
$url="http://mydomain.com/offers.php?country=US&offerID=5555&key=".$random_number;
echo $url;
?>
offers.php
<?php
$key=$_GET['key'];
if($key<1 || $key>100)
die("Invalid key!");
?>
这显然是一个非常愚蠢的解决方案,因为它只使用一个随机数...但希望你看到我想要完成的事情。
我的想法是按小时加密日期字符串,并使用静态隐藏密钥加密它。这将使每小时的关键变化,对于欺诈者来说将更加困难。唯一的问题是如果有人在9:59从API获取了网址,它将在10:00到期,这太短了。
最好的方法是什么? (理想)键应该是......
你有什么建议?
答案 0 :(得分:0)
一次性使用哈希怎么样,存储当前用户的会话?
答案 1 :(得分:0)
这是我的操作方式。我不建议您将此方法作为安全或有效的解决方案,只是为了防止用户篡改我的网址。
public static function hashArray($arr, $timestamp)
{
$salt = "my-salt-here";
$md5 = md5(http_build_query($arr) . $salt . $timestamp);
return $md5;
}
//build the url
$timestamp = date("Y-m-d H"); //links will last for about two hours
//if you want single-use links, you can add a random number to params
$params = ['offer'=>10, 'country'=>'US'];
$params['hash']=hashArray($params, $timestamp); //build hash and add it
$url = 'http://my-domain.com/click.php?'.http_build_query($params);
//check the hash
public static function checkHash($params, $hash)
{
//allow current or previous hour
return $hash === hashArray($params, date('Y-m-d H'))
|| $hash === hashArray($params, date('Y-m-d H', time()-3600))
}
$params=$_GET;
$hash = isset($params['hash']) ? $params['hash'] : '';
unset($params['hash']);
checkHash($params, $hash);