我正在制作一个提供表单的插件,让任何人都可以向我的Wordpress网站提交帖子(自定义帖子类型)。我正在寻找一种阻止机器人/垃圾邮件发送者的非常基本的方法,所以我想通过电子邮件发送一个他们可以点击的确认码,并将状态更改为已发布。
我不想在数据库中存储任何内容,所以我只想发送类似" verification.php?id = 12"之类的内容,其中ID是帖子ID。这是非常明显的,所以我想让那个单个数字看起来更复杂,然后"解密"点击链接以显示实际的帖子ID。
伪代码:
If ($_GET['veriID'] != '')
$lastchar = substr($_GET['veriID'], -1);
publish_post($lastchar);
实现这一目标有哪些选择?我应该只生成一个随机字符串并将帖子ID附加到末尾还是有更好的方法?
答案 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,然后在确认时解码。
这对大多数程序员来说相对明显,但不一定适合普通用户。
答案 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 );