1

phpとMySQLを使用してCRUDで削除するための最も安全な方法またはベストプラクティスを決定しようとしています。私が教えられた方法は、リンクを作成し、変数に渡されたIDで<a href="delete.php=?{$id}">Delete</a>delete.phpにメソッドを実行させることでした。delete()$_GET

  1. Webクローラーにこのページの表示を許可した場合、各ページの各削除リンクをクロールした場合、データベース全体を削除できませんでしたか?

  2. 手動で呼び出すページを理解した誰かが、レコードdelete()に必要な番号を含むURLをロードして、$_GETレコードを削除できませんでしたか?

  3. CRUDを介して何も削除せずに、テーブルにDeleted列を追加して、ユーザーには削除されたように見せたほうがよいでしょうか。

  4. 私はただの妄想ですか?

4

5 に答える 5

2

Webクローラーにこのページの表示を許可した場合、各ページの各削除リンクをクロールすると、データベース全体を削除できませんでしたか?

はい。

delete()を呼び出すページをどういうわけか理解した人は、$ _ GETに必要な番号を含むURLを手動でロードし、レコードを削除できませんでしたか?

はい。

CRUDを介して何も削除せずに、テーブルにDeleted列を追加して、ユーザーには削除されたように見せたほうがよいでしょうか。

実際に削除したい場合は、imo、削除する方が良いです。

私はただの妄想ですか?

全くない。


次のようなdelete.phpスクリプトがある場合(CRUD atmを無視し、MySQLについて話します):

$q = "DELETE FROM mytable WHERE row = $_GET['id']";
$r = mysql_query($q);

そうです、最初の2つの懸念は、実際に何が起こるかということです。これらのリンクに遭遇したスパイダーはDBレコードを削除し、リンクを発見した悪意のあるユーザーが同様にDBから行を削除する可能性があります。

これは通常、2つの方法で処理されます。

  1. delete.phpリンクを持ってはいけない人(ログインしていない人、管理者としてログインしていない人など)にdelete.phpリンクを提供しないでください。ただし、これは単なる便利な機能であり、そうではないことに注意してください。偶発的/悪意のある削除からDBを保護します。

  2. delete.phpスクリプトで、スクリプトを実行している人が行を削除できることを確認します。ほとんどの場合、ログイン時に設定されたセッション変数をチェックすることによって行われます(例if($_SESSION['can_delete'] != true){ die('Insufficient Privileges'); })。

delete.phpリンクを持ってはいけない人に提供しないことは役に立ちますが、安全にしたい場合は、delete.phpスクリプトでアクセス許可を明示的に確認する必要があります。

于 2012-05-05T02:30:59.263 に答える
1

運命の蜘蛛を読んでください。

リンクを使用して削除することはできます、クロールできる場所、または内部のインデックス作成スパイダーによってクロールされる可能性のある場所にリンクを公開しないでください。代わりに、すべての削除アクションでユーザー許可をチェックして、削除を行うユーザーがそれを所有しているか、または変更することを許可されていることを確認する必要があります。

したがって、delete()メソッドは単に削除(またはを呼び出すコントローラースクリプト)を行う以上のことを行う必要がありますdelete()。変更または削除を実行する前に、必ずユーザー認証を確認してください。

実際に削除を実行するか、単に行を削除済みとしてマークするかは、アプリケーションで行の削除を取り消す必要があるかどうかによって異なります。いずれにせよ、行動する前に承認を確認してください。

于 2012-05-05T02:31:57.203 に答える
1
  1. はい。これはかなりの数の人々に起こりました、グーグルは「削除」ページをクロールして彼らの内容を削除します。それについて本当に良いブログ投稿があったことを覚えていますが、それを見つけることができないようです。

  2. はい、これは完全に可能であり、非常に簡単です。そのため、認証システムを構築する必要があります。つまり、何かを実行する前に、システムは、アクションを実行する前に、ユーザーが要求したことを実行できるかどうかを確認する必要があります。

  3. 繰り返しますが、これは状況によって異なります。データが使用できなくなった場合は、必ず削除して削除してください。ただし、ある種の「削除解除」をサポートする場合は、アイテムを削除済みとしてマークするだけです。

  4. いいえ :)

于 2012-05-05T02:33:08.930 に答える
1

簡単な方法の1つは、次のようなセッションを開始することです。

$somevar = 'abc123'
$_SESSION['secureDelete'][$id] = $somevar;

次に、これを印刷します。

<a href="delete.php?id={$id}&action={$somevar}">Delete</a>

ファイルを削除する場合は、そのセッションがその$somevar値で存在するかどうかを確認します。

if (isset($_SESSION['secureDelete'][$id]) && $_SESSION['secureDelete'][$id] == $_GET['action']) {
  deleteFunction($_GET['id']);
}
于 2012-05-05T02:39:59.627 に答える
0

POSTメソッドを使用してIDを非表示にしてみてください。次のようになります。

<form action="" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>"/> 
<button type="submit">Delete</button> 
</form>
于 2014-05-06T09:04:06.433 に答える