通过URL $ _GET参数发送Passkey

时间:2013-03-13 16:59:24

标签: php encryption

我有一个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到期,这太短了。

最好的方法是什么? (理想)键应该是......

  • 动态 - 它应该经常变化。
  • 轻量级 - 只需检查密钥就不能花费大量资源。
  • 很难破解/模拟。

你有什么建议?

2 个答案:

答案 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);