php MySQL CRUD: Изтривам ли безопасно?

Опитвам се да определя най-безопасния начин или най-добрата практика за изтриване в CRUD с помощта на php и MySQL. Начинът, по който бях научен, беше да създам <a href="/bgdelete.php=?{$id}">Delete</a> връзка и delete.php да изпълни моя delete() метод на id, подаден в променливата $_GET.

  1. Ако позволя на уеб робот да види тази страница, не може ли да изтрие цялата база данни, ако обходи всяка връзка за изтриване на всяка страница?

  2. Не може ли някой, който по някакъв начин да е разбрал страницата, която извиква delete(), ръчно да зареди URL адреса с каквото и число да иска в $_GET и да изтрие записите?

  3. По-добре ли е никога да не изтривате нищо чрез CRUD, а да добавите колона Изтрити към таблицата и да изглежда така, сякаш е изтрита за потребителя?

  4. Дали съм просто параноик?


person Jonathan Eckman    schedule 05.05.2012    source източник
comment
Изобщо не сте параноик - всичко това са основателни опасения.   -  person jedwards    schedule 05.05.2012
comment
Фирмата, в която работя, крие всичко. Но предполагам, че краткият отговор е да се използва удостоверяване за неща като това...   -  person Kyle Macey    schedule 05.05.2012
comment
Примерна история за проблем #1   -  person jprofitt    schedule 05.05.2012


Отговори (5)


Ако позволя на уеб робот да види тази страница, не би ли могъл да изтрие цялата база данни, ако обходи всяка връзка за изтриване на всяка страница?

да

Не може ли някой, който по някакъв начин е разбрал страницата, която извиква delete(), ръчно да зареди URL адреса с каквото и число да иска в $_GET и да изтрие записите?

да

По-добре ли е никога да не изтривате нищо чрез CRUD, а да добавите колона „Изтрити“ към таблицата и да изглежда така, сякаш е изтрита за потребителя?

Ако наистина искате да го изтриете, imo, изтриването е по-добре.

Просто параноичен ли съм?

Въобще не.


Ако току-що сте имали скрипт delete.php, който има нещо като следното (игнориране на CRUD atm и говорене за MySQL):

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

Тогава да, първите ви две притеснения всъщност са какво ще се случи. Паяк, който се натъкне на тези връзки, би довел до изтриване на записите в DB, ​​а злонамерен потребител, който открие връзките, би могъл по подобен начин да изтрие редове от DB.

Това обикновено се обработва по два начина:

  1. Не предлагайте връзката delete.php на хора, които не трябва да я имат (хора, които не са влезли в системата, хора, които не са влезли като администратори и т.н.) -- но имайте предвид, че това е просто милост и не защитава вашата база данни от случайно/злонамерено изтриване.

  2. В скрипта delete.php проверете дали лицето, което го изпълнява, има право да изтрива редове. По-голямата част от времето се извършва чрез проверка на променливите на сесията, които са били зададени при влизане (напр. if($_SESSION['can_delete'] != true){ die('Insufficient Privileges'); }).

Въпреки че е полезно да не предлагате връзката delete.php на хора, които не трябва да я имат, трябва изрично да проверите за разрешения в скрипта delete.php, ако искате да е защитен.

person jedwards    schedule 05.05.2012

Прочетете The Spider of Doom.

Можете да използвате връзка, за да изтриете неща, но връзката никога не трябва да бъде публично изложена, където може да бъде обходена или дори обходена от вътрешен индексиращ паяк. Вместо това трябва да проверявате потребителското упълномощаване при всяко действие за изтриване, за да сте сигурни, че потребителят, който прави изтриването, притежава или по друг начин е упълномощен да го променя.

Така че вашият delete() метод трябва да направи повече от просто да направи изтриването (или скрипта на контролера, който извиква delete()). Винаги проверявайте за упълномощаване на потребителя, преди да извършите промяна или изтриване.

Дали наистина ще извършите изтриване или просто ще маркирате редове като изтрити, зависи от това дали имате нужда приложението ви да може да ги отмени. Така или иначе, проверете за разрешение, преди да действате.

person Michael Berkowski    schedule 05.05.2012

  1. да Това се е случвало на доста хора, Google обхожда страница за „изтриване“ и премахва съдържанието им. Спомням си, че имаше наистина добра публикация в блога за това, но изглежда не мога да я намеря.

  2. Да, това е напълно възможно и много лесно за изпълнение. Ето защо трябва да изградите система за оторизация. Това означава, че преди да бъде извършено нещо, системата трябва да провери дали потребителят има право да направи това, което е поискал, преди да извърши действието.

  3. Отново, това зависи. Ако вече няма полза от данните, непременно ги изтрийте и се отървете от тях. Но ако искате да поддържате някакъв вид „възстановяване на изтриване“, тогава просто маркирайте елемента като изтрит.

  4. No :)

person F21    schedule 05.05.2012

Един прост начин би бил да започнете сесия като:

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

и след това отпечатайте това:

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

Когато искате да изтриете файла, проверявате дали тази сесия съществува с тази стойност $somevar:

if (isset($_SESSION['secureDelete'][$id]) && $_SESSION['secureDelete'][$id] == $_GET['action']) {
  deleteFunction($_GET['id']);
}
person Marian Zburlea    schedule 05.05.2012

Опитайте да използвате метода POST и скрийте ID, трябва да е така

<form action="" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>"/> 
<button type="submit">Delete</button> 
</form>
person Jake Pucan    schedule 06.05.2014