MySQL PHP在网站上显示之前通过电子邮件验证广告/帖子?

时间:2009-08-25 00:16:31

标签: php mysql

使用PHP MySQL在基于Web的“购买和销售”应用程序上工作,用户可以在其中发布项目和服务的广告。

在系统上显示新广告之前,必须有一种验证方法,以确保用户提供的电子邮件地址正确,并且广告是合法的。

我想向任何新广告的创建者发送包含网址的电子邮件,该网址指向主要功能是接收发布变量$ ads_id的网页,并从数据库中选择广告以进行更新/编辑/删除

此变量使用PHP语法嵌入到url中 即。 [http://www.example.com?content=modify_advert&advert_id=2246317]

这部分实现起来非常简单,但是,如果用户要将名为“advert_id = 2246317”的变量修改为任何其他整数,他们可以访问系统中的其他帖子/广告。

系统是基于广告的,用户不需要帐户或登录发布,因此我们无法在验证点提示登录,这本来很方便。

关于我们如何保护系统中的广告/帖子不被上述网址访问的任何想法???

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果访问者只能通过电子邮件发送的链接查看该页面,则可以在该地址中包含哈希而不是advert_id - 实际上是随机的,时间密码。

生成这样一个随机密码的一个常见且“通常足够好”的技巧是采用单个,秘密,真正随机的字符串(我通常使用grc.com),将其与唯一的advert_id连接起来,然后哈希例如,SHA1()。像这样:

UPDATE advert SET advert_hash = SHA1(CONCAT(advert_id, 'lots-of-randomness-here'))

您甚至可以通过添加time()或(更好的是)随机数字来改变这种情况。结果是存储在数据库中的40个字符的字符串,没有人可以预测(不知道用于生成它的秘密数据)。

例如,我可能会这样做,而不是advert_id=1

f2db832ddfb149522442c156dadab50307f12b62

如果我想偷偷地编辑advert_id=2(其他人创建的),我首先必须猜测哈希是这个完全不同的字符串:

e5c6a3a9473b814b3230ee7923cbe679fcebc922

因此,请将其包含在网址而不是广告ID中(或者,如果您愿意,除了广告ID之外),并且突然您的用户无力破坏其他人的内容。

答案 1 :(得分:0)

您可以在ID中添加salt,然后将其哈希。

sha1($advert_id . $salt);

通过URL而不是advert_id将此内容发送给用户,并将其与advert_id一起存储在您的数据库中。

然后,当他们点击该链接时,您会找到该散列值的匹配广告。

让盐成为一个秘密就是如何阻止用户“猜测”一个有效的网址,让他们修改他们没有发布的广告。也许您可以使用用户的电子邮件地址,发布的时间和/或用户在发帖时输入的名称或内容。

答案 2 :(得分:0)

生成GUID作为广告ID,因此简单的ID猜测攻击不太可能成功。