【问题标题】:How to set cookies for 20 min and check if they are expired如何设置 cookie 20 分钟并检查它们是否过期
【发布时间】:2011-12-21 12:02:09
【问题描述】:

我正在考虑一个允许用户每 20 分钟仅发布 1 篇文章的系统。我不使用会员系统,所以我想我可以设置 20 分钟的 cookie。当用户发布内容时,检查是否设置了 cookie,如果是,则显示类似“每 20 分钟仅允许 1 篇帖子”的消息,如果未设置,则将内容放入数据库。

我对 php 比较陌生,不知道如何设置 cookie,我尝试查看 php.net 的 cookie 手册,但这对我来说太混乱了。那么您能否展示如何设置安全 cookie 20 分钟并检查它是否已设置。也许你有更好的建议可以代替 cookie 等。

谢谢。

【问题讨论】:

    标签: php cookies


    【解决方案1】:

    查看这些函数:

    要将 cookie 设置为 20 分钟,您可以这样做:

    setcookie("postedArticle", true, time() + (60 * 20)); // 60 seconds ( 1 minute) * 20 = 20 minutes
    

    检查是否设置了cookie:

    if(isset($_COOKIE['postedArticle']) && $_COOKIE['postedArticle'] == true)
    { 
        // IS SET and has a true value
    }    
    

    【讨论】:

    • 所以要设置 20 分钟,我会使用类似的东西: setcookie("timeCookie", time()+20, "/", NULL, NULL, true); ?
    • 时间以秒为单位,所以你 1 分钟 = 60 秒 * 20 = 20 分钟,秒参数也应该是 cookie 值,而不是时间。
    • 好的,我明白了))) 以便 if 语句检查 cookie 是否设置正确?所以 20 分钟后它会检测到没有设置 cookie,所以我可以使用 else 条件来做其他正确的事情?
    • 最后一个问题))) 这比正确吗? setcookie("time", true, time()+ (60 * 20), "/", NULL, NULL, true);
    • 是正确设置cookie,函数isset()检查会话是否设置,第二部分检查cookie是否设置为true。
    【解决方案2】:

    为此目的使用 cookie 毫无意义。
    如果您说的是注册用户,则必须将此类信息存储在服务器端。
    但如果是匿名用户,你不能阻止他们每秒发帖。从浏览器中清除 cookie 只需按一个按钮。

    【讨论】:

    • 但是,它增加了一些安全性,因为不是每个人都会清除他们的 cookie,是的,有人想要向垃圾网站发送垃圾邮件,他们很可能会这样做......但这总比没有好吧?
    • “总比没有好”的规则在信息技术领域很少奏效。即使根本没有保护措施,公平用户也不会违反此规则,只是为了尊重您的网站规则。我相信,虽然使用脚本自动发布此类帖子的垃圾邮件发送者以及您的保护对象是针对他们的,但我相信他们几乎不会注意到这一点。
    【解决方案3】:

    正如其他人指出的那样,cookie 方法来做这种工作是没用的。所以这里加密也是一种资源浪费。

    如果您想防止垃圾邮件,您应该插入CAPTCHA 验证

    您在这里要做的是准备好使用的代码。

    我已将 cookie 值加密,因此任何人都无法更改 cookie 的值。

    但他们仍然可以删除普通用户在看到其中一些加密值时不会执行的 cookie。

    <?php
    $cookiename="yourcookiename";
    $mysalt="secret salt";
    function encrypt($text, $salt) 
    { 
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
    } 
    
    function decrypt($text, $salt) 
    { 
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    }
    
    $read="false";
    if(isset($_COOKIE[$cookiename]))
        {$read=decrypt($_COOKIE[$cookiename], $mysalt);
        }
    if($read=='true')
    {
    //your stuff
    setcookie($cookiename, encrypt("true", $mysalt), time()+20*60);
    }
    else {
    //can't post
    }
    
    ?>
    

    【讨论】:

    • @IlyaKnaup $mysalt 是用于加密和解密的密钥,任何随机文本都应该只有您知道,否则任何人都可以解密加密值。
    • @IlyaKnaup 是的.. 确保它不是字典中的单词.. 任何随机文本
    • 我不知道加密是否在这里增加了任何东西,因为如果您清除浏览器历史记录,也可以删除 cookie,人们将能够重新发布。
    • Uf 而不是 "true" 值,我可以将其设置为用户 Ip,以便检查 $read = "users ip" 是否有效,即使用户使用不同的浏览器也能正常工作?
    • @Col.Shrapnel 我同意你的看法,但他想知道这就是为什么我给了他一个方法。
    【解决方案4】:

    设置喜欢

    setcookie("TestCookie", $value, time()+1200);
    

    在 20 分钟后检查它是否会过期,否则不会。

    【讨论】:

    • 您的 cookie 的值.. 表示如果您为用户名设置 cookie,则“用户名”是您的标签,而 test123 是您的用户名值
    【解决方案5】:

    我知道这已经 8 岁了,但想补充一些关于使用 cookie 来满足您的特定需求的问题。

    如果您真的希望用户只发布 20 分钟,那么最好使用会话,而不是 cookie,因为 cookie 可以轻松编辑,人们只需将时间设置为 1 分钟或更短。所以最好使用的是会话。我知道这个答案是题外话,但只是想说一些信息,我希望它在某种程度上有所帮助。不过,我在 Cookie 和 Sessions 中也包含了一些文档,所以如果您或任何人需要一些额外的帮助。

    来源: Stack Overflow

    文档:

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多