1

我有一个 API 可以将 url 吐出到我网络上的重定向页面。网址看起来像这样:

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;
?>

报价.php

<?php
$key=$_GET['key'];
if($key<1 || $key>100)
die("Invalid key!");
?>

这显然是一个非常愚蠢的解决方案,因为它只使用一个随机数......但希望你能看到我想要完成的事情。

我的想法是按小时加密日期字符串并使用静态隐藏密钥对其进行加密。这将使密钥每小时更改一次,并且对于欺诈者来说将更加困难。唯一的问题是如果有人在 9:59 从 API 获取 url,它将在 10:00 过期,这太短了。

做这个的最好方式是什么?(理想的)关键应该是......

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

你有什么建议?

4

2 回答 2

0

存储当前用户会话的 1 次使用哈希怎么样?

于 2013-03-13T17:35:41.120 回答
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);
于 2020-04-06T19:29:36.827 回答