我想要创建自动电子证书。使用fpdf PHP类创建自定义证书非常容易。我设置的方式是给定一个URL
http://www.example.com/makepdf.php?name=myname&class=classname
您将获得一个PDF证书,其中包含学生姓名以及他们从$ _GET变量中获取的课程。当然,这意味着任何人都可以操纵URL来轻松创建自定义证书。 (他们无论如何都可以在Photoshop中执行此操作,但想法是操纵证书并非完全无关紧要。)一旦课程结束,我想向每个人发送邮件合并,并为其证书提供唯一的URL。
你会如何解决这个问题?我应该创建一组随机数并将它们与数据库中的学生/研讨会对相关联吗?是否有解决此问题的标准方法?
答案 0 :(得分:6)
情侣解决方案脱颖而出:
哈希机制将是这样的:
生成证书的链接时,您有$name
和$class
。您将创建第三个GET变量,该变量是$name
,$class
的散列,以及只有您的程序知道的秘密字符串。像这样:
$salt = "this is my secret";
$hash = md5($name . $class . $salt);
$url = "http://www.mysite.com/certificate.php?name=" . urlencode($name) . "&class=" . urlencode($class) . "&hash=" . $hash;
现在,当用户点击您的证书生成页面时,您必须验证哈希:
$salt = "this is my secret";
$expected = md5($_GET['name'] . $_GET['class'] . $salt);
if ($expected != $_GET['hash']) {
die("You are not authorized");
} else {
// User is OK; generate the certificate
}
答案 1 :(得分:0)
是的,如果你想限制你对固定池的输入,那么创建一个充满随机密钥的数据库是我的方式。
如果您想要更快更脏的方法,只需将密钥生成为文本文件,使用脚本将文件分开以将其发送给收件人,并从一份副本中读取您的PHP证书生成器服务器上的文件。
答案 2 :(得分:0)
您最好的选择是拥有一个学生/班级列表(某种数据库),并且只允许生成允许的证书。这样您就不需要模糊学生或班级的名称,因为只能生成有效的证书。
如果要求太多 - 您可以根据和某些salt 组合生成MD5哈希值,然后将该哈希值添加到URL中。这样就需要知道盐伪造一个URL。
http://www.example.com/makepdf.php?name=Tim&class=PHP&hash=c2c455ce438112b44499561131321126
然后生成脚本就这样做了:
$hash = md5($_GET['name'] . $_GET['class'] . $salt);
if($hash != $_GET['hash']){
//invalid request
}
当然,您需要使用相同的盐生成URL。
答案 3 :(得分:0)
假设您自己在服务器上生成这些URL,您可以将所有参数值一起加入字符串中:
hash_string = "myname:classname";
然后附加一个最终参数,该参数是该字符串的哈希值以及一些秘密种子:
query_string .= "&h=" . md5("my_secret_key:" . hash_string)
然后,当您收到查询时,只需检查以确保哈希匹配:
hash_string = params['name'] . ':' . params['class'];
if (params['h'] == md5("my_secret_key:" . hash_string)) ...
我真的不懂PHP语法,但你明白了。
答案 4 :(得分:-1)
我应该创建一组随机数并将它们与数据库中的学生/研讨会对相关联吗?
是