提示输入密码然后重定向

Posted

技术标签:

【中文标题】提示输入密码然后重定向【英文标题】:Prompt asking for password then redirecting 【发布时间】:2020-06-01 14:07:57 【问题描述】:

我对 phpjavascript 非常陌生,但我被困住了。到目前为止,我花了整整 7 个小时试图弄清楚这一点,但我只是不知道该怎么做或怎么做。所以在我的应用程序中,当您尝试向我的表中添加新行时,我有一个 html 表单来获取数据。当你在表单中输入数据,然后按提交时,它会提示输入密码,如果输入正确的密码,它会提交表单。它可以按我的意愿工作,这就是我所拥有的:

<button onclick="password()" type="button">Create New Hero</button>
    <div>
        <a id="discl">*-Required Fields</a>
    </div>
    <script>
        function password()
            var password = prompt("Please Enter the Admin Password");
            if(password != "shaun")
                alert("Wrong Password");
            
            else
                if(validation())
                document.getElementById("form_id").submit();
                
                else
                    alert("One or more required fields were left empty, or tried to use <script>");
                
            
        
        function validation()
            var f = document.getElementById("f_name").value;
            var l = document.getElementById("l_name").value;
            var d = document.getElementById("dob").value;
            var a = document.getElementById("alias").value;
            if(f == "" || l == "" || d == "" || f.includes("<script>") || l.includes("<script>") || a.includes("<script>"))
                return false;
            
            else
                return true;
            
        
    </script>

现在我的桌子上也有一个编辑和删除。我的问题是,对于编辑和删除,它们位于带有 href 的标签中,而不是按钮。这是它们在不要求密码的情况下工作时的最初外观:

               echo "<a href='./edit.php?id=$row['id']'>edit</a>";

因此,根据它所在的表的哪一行,您单击编辑或删除的位置,根据数据库中该行的 ID,它会编辑或删除该表。现在我的问题是我不知道如何正确设置该功能,因此它要求输入密码并重定向到正确的 url。这就是我现在拥有的:

           foreach($results as $row)
            echo "<tr>";
            echo "<td>$row['first_name']</td>";
            echo "<td>$row['last_name']</td>";
            echo "<td>$row['date_of_birth']</td>";
            echo "<td>$row['alias']</td>";
            echo "<td>$row['active']</td>";
            echo "<td>$row['hero']</td>";
            echo "<td>";
            echo "<a href='./edit.php?id=$row['id']'>edit</a>";
            echo " | ";
            echo "<a  href='javascript: password()'>delete</a>";
            echo "</td>";
            echo "</tr>";
        
        ?>
        <script type="text/javascript">
        function password()
            var password = prompt("Please Enter the Admin Password");
            if(password != "shaun")
                alert("Wrong Password");
            
            else
                window.location.replace("./delete.php?id=<?php echo $row['id']; ?>");
            
        
    </script>

这样做的问题是,无论我在表上单击哪个删除,它总是会删除最后一个,因为它在 url 之后得到的 ID 是我数据库中最后一个可用的 ID。我不确定我是否只是错过了一些小东西,或者我完全走错了路,但任何帮助都将不胜感激,因为我非常迷茫。谢谢

【问题讨论】:

您真的在 Javascript 中验证密码 - 其中包含硬编码的密码吗? 您知道密码可以通过 chrome 上的 Ctrl + U 从页面轻松复制。 if(password != "shaun") in JS - 爱它! 旁注:我在任何地方都看不到password_verify(),所以这对我来说,建议您将密码存储为纯文本,这是不应该的。 @mitkosoft 是的,我知道这不安全,也不应该如何处理密码或登录,但这仅适用于一个小项目。而且我确实在重定向的密码()函数中传递了 $row['id'] ,但正如我所说,该值始终是最后一个 id 并且它不响应我单击删除的表的哪一行 【参考方案1】:

这里不会评论任何安全问题,只评论逻辑。您需要在 PHP 循环期间将 $row['id'] 传递给您之后要使用的 JS password() 函数:

<?php
    foreach ($results as $row) 
        echo "<tr>";
        echo "<td>$row['first_name']</td>";
        echo "<td>$row['last_name']</td>";
        echo "<td>$row['date_of_birth']</td>";
        echo "<td>$row['alias']</td>";
        echo "<td>$row['active']</td>";
        echo "<td>$row['hero']</td>";
        echo "<td>";
        echo "<a href='./edit.php?id=$row['id']'>edit</a>";
        echo " | ";
        echo "<a  href='javascript: password(".$row['id'].")'>delete</a>";
        echo "</td>";
        echo "</tr>";
    
?>
<script type="text/javascript">
    function password(delId) 
        var password = prompt("Please Enter the Admin Password");
        if (password != "shaun") 
            alert("Wrong Password");
         else 
            window.location.replace("./delete.php?id="+delId);
        
    
</script>

【讨论】:

【参考方案2】:

忽略明显的安全问题,我建议这样做

<a href='#' class='edit'   data-id='<?= $row['id'] ?>'>edit</a> | 
<a href='#' class='delete' data-id='<?= $row['id'] ?>'>delete</a>

使用

window.addEventListerner('load',function() 
  document.querySelector('table').addEventListerner('click',function(e) 
    e.preventdefault(); // stop the link
    const tgt = e.target, id = tgt.getAttribute("id");
    if (tgt.classList.contains("edit") 
      location = '/edit.php?id='+encodeURIComponent(id);
    
    else if (tgt.classList.contains("delete") 
      let password = prompt("Please Enter the Admin Password");
      if (password === "shaun") 
        location.replace('/delete.php?id='+encodeURIComponent(id)=;
      
      else 
        alert("Wrong Password");
      
    
  )    
)

【讨论】:

【参考方案3】:

需要认证的是目标请求,而不是调用页面,否则任何人都可以调用./delete.php?... url并删除数据库中的一行。

这通常通过维护一个会话来完成,该会话会记住用户的登录信息。然后delete.php 请求可以检查用户是否已经登录/是否具有管理员权限,或者在必要时要求输入密码。

【讨论】:

以上是关于提示输入密码然后重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何为bash中提示输入的命令提供密码?

即使我输入正确的密码,为什么我总是被重定向到登录页面?

输入错误的用户名和/或密码后,如何将用户从登录控件重定向到错误页面?

Shell脚本交互之:自动输入密码

Shell脚本自动输入密码的三种方式

如何让浏览器保存密码而不重定向?