I';我试图用JavaScript对网页进行密码保护

I';我试图用JavaScript对网页进行密码保护,javascript,html,webpage,password-protection,Javascript,Html,Webpage,Password Protection,我试图用密码保护我的网页(例如),这样用户每次会话只需输入一次密码。这是我的问题:如果用户取消了初始提示或输入了错误的密码,然后被重定向到google.com,然后重新访问,则允许他们在不提示输入密码的情况下查看页面。 不确定我在解决这个小后门问题上做错了什么 下面是我试图实现的JavaScript: //Protect only once per browser session? (0=no, 1=yes) //Specifying 0 will cause protect to

我试图用密码保护我的网页(例如),这样用户每次会话只需输入一次密码。这是我的问题:如果用户取消了初始提示或输入了错误的密码,然后被重定向到google.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()
如果
protect
cookie是空字符串,则您的
loadornot()
仅加载
passwordProtect()
。它还将cookie的值设置为“yes”。因此,下次调用cookie时,cookie不再为空,并且永远不会调用“passwordProtect()”

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

如果希望函数A根据函数B中所做决策的结果有条件地执行,则必须告诉函数A等待函数B告诉您已做出决策。实现这一点的主要方法是回调和承诺


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

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

我以前所做的更改:

   //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()

理想情况下,只有在使用后端进行验证后才能提供敏感数据—对前端的更改将不会可靠地安全。毕竟,任何人都可以看到Javascript源代码。@CertainPerformance我该怎么做?我会改用php吗?我假设这只是为了“学习”目的?是的,它是@Ralph。那么给出的答案是正确的,loadornot()不会检查passwordProtect的结果。它将始终调用设置cookie的行。您可能假设,如果将window.location设置为新位置,则脚本将停止,这是不正确的。从“密码保护”中返回真/假,并使用返回值来决定是否添加protect='yes'cookie。如果您能用我的代码快速实现代码,我们将不胜感激。@Kamerov假设您先尝试一个,如果您遇到问题,寻求更多帮助。为了完整性:请注意,这是有效的,因为alert和prompt会阻止代码(其行为类似于堆栈上运行的经典代码)。如果您将它们替换为提取密码的奇特的异步UI,您将不得不使用承诺或回调,因为passwordProtect将是异步的。您将无法使用简单的布尔值作为函数的返回值。可以说,这暂时解决了我的问题,但大家一致认为,我需要实现一些其他功能以获得良好的安全性。PHP实现与JS相比如何@ralphI转而使用PHP,因为它看起来更有效,更私密。这就是为什么我首先问这是否是为了学习JavaScript。在实际生产中,你绝对不能这样做。请花时间理解服务器端代码和客户端代码之间的区别,并始终记住任何客户端代码都是不可信的,并且很容易被操作。。。从这个问题上看,你在这个领域似乎是相当新的。所以,花点时间更好地理解技术。祝你好运