PHP удаление записи без передачи идентификатора с $ _GET - PullRequest
0 голосов
/ 09 апреля 2020

Я хотел бы знать, есть ли способ удалить запись в php, не передавая ее через $ _GET, возможно, с помощью $ _POST или других методов. Я использовал этот код на странице read. php и

<table class="table table-bordered">
  <thead>
    <tr>
      <td>#</td>
      <td>Sigla</td>
      <td>Nome</td>
      <td>Bilancio</td>
      <td>Responsabile</td>
      <td>Azione</td>
    </tr>
  </thead>
  <tbody>
  <?php foreach ($rows as $row): ?>
    <tr>
      <td><?=$row['id']?></td>
      <td><?=$row['sigla']?></td>
      <td><?=$row['nome']?></td>
      <td><?=$row['bilancio']?></td>
      <td><?=$row['responsabile']?></td>
      <td class="actions">
        <a href="update.php?id=<?php echo $row['id']; ?>" class="edit">
          <i class="fas fa-pen fa-xs"></i>                
        </a>
        <a href="delete.php?id=<?php echo $row['id']; ?>" class="trash">
          <i class="fas fa-trash fa-xs"></i>
        </a>
      </td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>

, как вы можете видеть для каждой записи, я создаю href с перенаправлением на страницу «delete» или «update», проходящую через $ Получить идентификатор. Есть ли способ не показывать идентификатор в URL? (возможно через $ _POST), я прочитал сотни статей, но ни один из них не ответил на мой вопрос.

Ответы [ 4 ]

0 голосов
/ 09 апреля 2020

Вы можете сделать это как-то так: https://laravel.com/docs/5.8/encryption

На сервере вы должны зашифровать все свои параметры, например, следующий код:

$encryptedParameters = encrypt([
  'id' => 132,
  'something' => 'value',
  'another_key' => 'another_value',
]);

и затем отправьте это значение в ваш шаблон html.

На внешнем интерфейсе, если вы хотите сделать это с помощью GET, сделайте что-то подобное, и ваши пользователи не смогут увидеть, что вы отправляете на ваш back-end, потому что он зашифрован:

<a href="delete.php?s=<?php echo $encryptedParameters; ?>"></a>

и если вы хотите сделать это с помощью POST, вы можете сделать это с помощью Ajax или сгенерировать форму и поместить это значение в качестве скрытого ввода внутри Это. и затем, когда пользователь щелкнул эту ссылку на бэк-энде, вы должны расшифровать ее и использовать ее значения, подобные следующему коду:

$decryptedParameters = decrypt($_GET['s']);
$id = $decryptedParameters['id'];
$something = $decryptedParameters['something'];
$another_key = $decryptedParameters['another_key'];
0 голосов
/ 09 апреля 2020

Идентификатор, отображаемый в URL, абсолютно не проблема. Это не делает операцию удаления более безопасной или небезопасной. У вас есть одна, может быть, две другие проблемы:

  • Любая деструктивная операция должна использовать POST-запросы. Обычные ссылки могут свободно сканироваться поисковыми системами или предварительно загружаться браузерами. Это означает, что как только Google сканирует все ваши ссылки, ваша база данных будет пустой. Вот почему использование POST важно, потому что каждый правильно работающий HTTP-клиент понимает, что POST является деструктивным.
  • Если вы задаете этот вопрос, потому что боитесь, что пользователи могут просто манипулировать идентификатором, показанным в URL, и удалять другие записей, которые они не должны удалять, тогда ваша настоящая проблема не в том, где вы передаете идентификатор, а в том, что у вас нет проверки прав на вашем сервере.

Для начала используйте форму для создать POST-запросы:

<form action="delete.php?id=<?php echo htmlspecialchars(urlencode($row['id'])); ?>" 
      method="post">
    <input type="submit" value="Delete">
</form>

(также обратите внимание на правильный способ URL-кодирования и HTML -кодирования значения, поскольку вы встраиваете его в URL-адрес в контексте HTML.)

На стороне PHP вы бы обработали это примерно так:

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $id = $_GET['id'];
    // permission checking here
    // delete record here
}

Вместо передачи идентификатора в качестве параметра запроса, вы также можете сделать его полем формы:

<form action="delete.php" method="post">
    <input type="hidden" name="id" value="<?php echo htmlspecialchars($row['id']); ?>">
    <input type="submit" value="Delete">
</form>

На сервере вы бы взяли значение из $_POST['id'] вместо $_GET['id'].

Обратите внимание, что это ничего не меняет в корне и в основном это дело вкуса. .

* 102 5 * Вы можете настроить эту кнопку для отправки в черный цвет различными способами или, возможно, переключиться на более интерактивный Javascript; но это всего лишь способы улучшить эту базовую c операцию.
0 голосов
/ 09 апреля 2020

Преобразование запроса GET в сообщение с использованием скрытой отправки формы. Предпочтительным способом является шифрование идентификатора записи при отправке данных.

0 голосов
/ 09 апреля 2020

Вам нужна AJAX или форма

Использование ссылки для удаления ОЧЕНЬ опасно, так как однажды viist из сканера и ваша база данных повреждены

Я предлагаю что-то вроде

  1. делегировать щелчок в таблицу контейнеров
  2. использовать атрибуты данных для идентификатора
  3. Ajax, используя POST - я использую fetch, чтобы сделать это здесь
let fetchData = {
  method: 'POST'
}
const url = "delete.php";
document.querySelector("form").addEventListener("click", function(e) {
  const tgt = e.target;
  if (tgt.classList.contains("trash") && confirm("Delete "+this.id+"?")) {
    e.preventDefault();
    fetchData["body"] = {
      "id": this.getAttribute("data-id")
    };
    fetch(url, fetchData)
      .then(function() {
        console.log("deleted");
      });
  }
})
<a href="#" data-id="<?php echo $row['id']; ?>" class="trash">
  <i class="fas fa-trash fa-xs"></i>
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...