Подскажите запрос пароля и перенаправление - PullRequest
0 голосов
/ 17 февраля 2020

Я очень плохо знаком с PHP и JavaScript, и я застрял. Я потратил целых 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>";

Таким образом, в зависимости от того, какая строка таблицы была, где вы нажимали, редактировать или удалять, основываясь на идентификаторе строки из базы данных. , он будет редактировать или удалять эту таблицу. Теперь моя проблема в том, что я не знаю, как правильно настроить функцию, чтобы она запрашивала пароль и перенаправляла на правильный 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 это последний доступный идентификатор из моей базы данных. Я не уверен, что мне просто не хватает чего-то маленького или я совершенно не на том пути, но любая помощь будет признательна, потому что я очень потерян. Спасибо

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Не буду комментировать какие-либо проблемы безопасности здесь, только лог c. Вам нужно передать $row['id'] во время PHP l oop вашей функции 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>
0 голосов
/ 18 февраля 2020

Это целевой запрос, а не вызывающая страница, которая требует аутентификации, в противном случае любой может вызвать ./delete.php?... url и удалить строку в базе данных.

Обычно это делается путем поддержания сеанса, который запоминает логин пользователя. Затем запрос delete.php может проверить, выполнил ли пользователь вход в систему / имеет ли он права администратора, или запросить пароль при необходимости.

0 голосов
/ 17 февраля 2020

Игнорируя вопиющую проблему безопасности, я предлагаю

<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");
      }
    }
  })    
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...