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

时间:2018-03-24 21:54:44

标签: php wordpress encryption email-verification

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

我不想在数据库中存储任何内容,所以我只想发送类似" verification.php?id = 12"之类的内容,其中ID是帖子ID。这是非常明显的,所以我想让那个单个数字看起来更复杂,然后"解密"点击链接以显示实际的帖子ID。

伪代码:

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用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);

您可以将秘密存储在常量值或更好的值:每个插件安装一个。

由于您始终可以从post-id计算哈希值,因此不需要将数据存储在数据库中。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-2)

一种简单的方法是在帖子中添加自定义字段,并在其中存储随机代码

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

它的真实存储在db post meta中,但你不会明确地这样做,而是按照WP的工作原理使用它:

get_post_meta(  $post_id,  $key, true );
相关问题