从一个号码创建一个唯一的验证码?

Creating a unique verification code from a single number?

我正在制作一个提供表单的插件,让任何人都可以向我的 Wordpress 网站提交 post(自定义 post 类型)。不过,我正在寻找一种非常基本的阻止方法 bots/spammers,所以我想通过电子邮件发送一个确认码,他们可以单击该确认码并将状态更改为已发布。

我不想在数据库中存储任何东西,所以我想只发送类似 "verification.php?id=12" 的东西,其中 ID 是 post ID。不过这很明显,所以我想让那个数字看起来更复杂,然后 "decrypt" 它在单击 link 时显示实际的 Post ID。

伪代码:

If ($_GET['veriID'] != '')
$lastchar = substr($_GET['veriID'], -1);
publish_post($lastchar);

实现这一目标有哪些选择?我应该只生成一个随机字符串并将 post ID 附加到末尾还是有更好的方法?

您始终可以将 post ID 编码为 base64,然后在确认后解码。

这对大多数程序员来说是相对明显的,但对普通用户来说不一定。

http://php.net/manual/en/function.base64-encode.php

您可以使用 HMAC 对请求进行身份验证。生成的 url 将如下所示:

.../verification.php?post=12&hash=5f13532e49447facaa3dce9080bfffec3c6731eca6b4d590670dd0b1137e7476

要生成哈希,使用 HMAC algorithm。这具有使用秘密值的优点。因此,该值不能由消息(post id)单独计算。

生成哈希值的代码:

define('secret', 'really super secret value');

$post_id = 12;

// Get the hash
echo hash_hmac('sha256', $post_id, secret);

您可以将秘密存储为常数值或更好:每个 plugin-installation.

由于您始终可以从 post-id 计算散列,因此无需将数据存储在数据库中。

一种简单的方法是向您的 post 添加一个自定义字段并像这样在其中存储一个随机代码

$code = '';
 for ( $i = 1; $i <= 3; ++$i ) {
  $code .=  chr(rand(97,122)) . rand(0,9);
 }

这是真的,它存储在数据库 post 元数据中,但您不会明确地这样做,而是按照 WP 的工作方式使用:

get_post_meta(  $post_id,  $key, true );