【问题标题】:I'm trying to password protect a webpage with JavaScript我正在尝试使用 JavaScript 对网页进行密码保护
【发布时间】:2018-07-30 02:59:45
【问题描述】:

我正在尝试使用密码保护我的网页(例如http://mywebsite.com/),以便用户每次会话只需输入一次密码。这是我的问题:如果用户取消了初始提示或输入了错误的密码,然后被重定向到 google.com,然后重新访问 http://mywebsite.com/ 它允许他们在不提示输入密码的情况下查看页面。

不知道我做错了什么来解决这个小问题的后门。

这是我尝试实现的 JavaScript:

//Protect only once per browser session? (0=no, 1=yes)
       //Specifying 0 will cause protect to load every time page is loaded
   var once_per_session=1

   function get_cookie(Name) {
          var search = Name + "="
          var returnvalue = "";
          if (document.cookie.length > 0) {
            offset = document.cookie.indexOf(search)
            if (offset != -1) { // if cookie exists
                offset += search.length
                // set index of beginning of value
                end = document.cookie.indexOf(";", offset);
                // set index of end of cookie value
                if (end == -1)
                     end = document.cookie.length;
                returnvalue=unescape(document.cookie.substring(offset, end))
                }
           }
          return returnvalue;
   }

    function passwordProtect(){
        var password;
        var pass1 = "thePassword";
        password = prompt('Enter password to view page',' ');
        if(password == pass1){
            alert('Correct password, click ok to enter');
            window.location="http://mywebsite.com";
        }
        else {
            window.location="http://google.com";
        }
    }

   function loadornot(){
          if (get_cookie('protect')==''){
          passwordProtect()
          document.cookie="protect=yes"
          }
   }

   if (once_per_session==0)
          passwordProtect()
   else
          loadornot()

【问题讨论】:

  • 理想情况下,仅使用后端验证后才提供敏感数据 - 对前端的更改不会可靠安全。毕竟,任何人都可以看到 Javascript 源代码。
  • @CertainPerformance 我将如何处理?我会用 php 代替吗?
  • 我认为这只是为了“学习”目的?
  • 是的,是@Ralph
  • 那么给出的答案是对的,loadornot() 不会检查 passwordProtect 的结果。它将始终调用设置 cookie 的行。您可能假设如果您将 window.location 设置为一个新位置,它之后的脚本将停止,这是不正确的。从您的密码保护中返回一个真/假,并使用返回值来决定您是否将添加保护='yes' cookie。

标签: javascript html webpage password-protection


【解决方案1】:

如果protect cookie 是空白字符串,您的loadornot() 只会加载passwordProtect()。它还将 cookie 的值设置为“是”。因此,下次您调用它时,cookie 不再为空白,并且永远不会调用 `passwordProtect()'。

您似乎相信,如果 passwordProtect() 将用户发送到 google 页面,原因是未能提供正确的密码,loadornot() 函数将在不执行最后一行的情况下结束。事实并非如此。请记住,javascript 有一个异步执行模型,这意味着loadornot() 在执行对passwordProtect() 的调用时不会停止执行。当您的用户输入密码时,将 cookie 值设置为“yes”的行已经执行。

如果您希望函数 A 根据函数 B 中的决策结果有条件地执行,您必须告诉函数 A 等到函数 B 告诉您已做出决策。执行此操作的主要方法是回调和承诺。

有关如何进行回调的简单示例,请参阅 w3schools.com 的 this example。有关使用回调和承诺自定义确认框的更复杂示例,请参阅this

【讨论】:

  • 任何用我的代码实现的代码的快速示例也将不胜感激。
  • @Kamerov 假设您先尝试做一个,然后如果遇到问题,请寻求更多帮助。
【解决方案2】:

我通过从 passwordProtect() 返回一个布尔值,然后在将 cookie 更新为“是”之前检查该布尔值是否为真来解决了这个问题。我知道这是密码保护的基本实现,但所有帮助都很棒。

我之前所做的更改:

   //Protect only once per browser session? (0=no, 1=yes)
   //Specifying 0 will cause protect to load every time page is loaded
    var once_per_session=1
    var bool

    function get_cookie(Name) {
       [see post]
    }

    function passwordProtect(){
        var password;
        var pass1 = "thepassword";
        password = prompt('Enter password to view page',' ');
        if(password === pass1){
            alert('Correct password, click ok to enter');
            window.location="http://example.com";
            return true;
        }
        else {
            window.location="http://google.com";
            return false;
        }
    }

    function loadornot(){
        if (get_cookie('protect')===''){
            bool = passwordProtect();
            if(bool === true)
                document.cookie="protect=yes";
        }
    }

    if (once_per_session===0)
        passwordProtect()
    else
        loadornot()

【讨论】:

  • 为了完整起见:请注意这是有效的,因为 alert 和 prompt 阻塞了代码(表现得像在堆栈上运行的经典代码)您将不得不使用承诺或回调,因为 passwordProtect 将是异步的。您将无法使用简单的布尔值作为函数的返回值。
  • 可以说这暂时解决了我的问题,但大家一致认为我需要实现其他一些东西才能获得不错的安全性。 PHP 实现与 JS 相比如何? @ralph
  • 我改用 PHP 是因为它看起来更有效和私密
  • 这就是为什么我首先询问这样做的目的是不是为了学习 JavaScript。您绝对不能为实际生产使用做类似的事情。请花时间了解服务器端代码和客户端代码之间的区别,并始终记住任何客户端代码都不能被信任并且很容易被操纵......从这个问题来看,看起来你在这个领域相当新。因此,请花点时间更好地了解技术。祝你好运!
猜你喜欢
  • 2016-11-19
  • 2020-04-11
  • 2012-03-11
  • 2010-10-03
  • 2018-08-29
  • 1970-01-01
  • 2016-09-30
  • 2012-12-13
  • 2012-10-01
相关资源
最近更新 更多