如何模糊GET变量?

时间:2010-09-09 22:05:27

标签: php get

我想要创建自动电子证书。使用fpdf PHP类创建自定义证书非常容易。我设置的方式是给定一个URL

http://www.example.com/makepdf.php?name=myname&class=classname

您将获得一个PDF证书,其中包含学生姓名以及他们从$ _GET变量中获取的课程。当然,这意味着任何人都可以操纵URL来轻松创建自定义证书。 (他们无论如何都可以在Photoshop中执行此操作,但想法是操纵证书并非完全无关紧要。)一旦课程结束,我想向每个人发送邮件合并,并为其证书提供唯一的URL。

你会如何解决这个问题?我应该创建一组随机数并将它们与数据库中的学生/研讨会对相关联吗?是否有解决此问题的标准方法?

5 个答案:

答案 0 :(得分:6)

情侣解决方案脱颖而出:

  • 存储姓名&数据库中的类,并使用数字ID引用它们,而不是在请求中传递数据
  • 将信息保留在请求中,但添加一个安全哈希,以防止篡改数据

哈希机制将是这样的:

生成证书的链接时,您有$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)

  

我应该创建一组随机数并将它们与数据库中的学生/研讨会对相关联吗?