Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Удаление записи из бд ссылкой
Форумы портала PHP.SU » PHP » Программирование на PHP » Удаление записи из бд ссылкой

Страниц (2): [1] 2 »
 

1. LEONeso - 13 Сентября, 2010 - 23:00:14 - перейти к сообщению
Как делается ссылка на удаление записи из БД?

Предполагаю, что это метод _GET с условием на странице, где ?delete=md5
так? естественно идет сверка "md5" с данными из таблицы, если таблица найдена с таким md5 то удаляем, ну а "delete" - это своего рода команда для условия (+ сама таблица =) ), типа если $_GET['delete'] появилась, то делаем переменную, записываем в неё уже имеющуюся md5 (по идее она автоматом там будет) и делаем сверку, если условие выполняется, удаляем запись...

Верно я думаю? Собственно смысл такой, дать юзеру удалить свою запись через ссылку, которую ему дают на мыло, но чтоб не организовывать хаус и избежать удаление всего, простым изменением id, то md5 лучше походит для этого дела.

Припоминаем великий рандом =)
2. AdMeen - 14 Сентября, 2010 - 08:09:23 - перейти к сообщению
LEONeso пишет:
...

Попробуйте передавать просто уникальный сгенерированный для каждого идентификатор, который методом простого подбора будет крайне сложно подобрать, т.е. примерно как вы и написали, только передавайте id юзера и этот самый uniqid и смотрите, если есть такой юзер с таким ключом, то удаляйте его. а запрос по желанию, как один из вариантов ?action=delete&uid=12&id=blabla
3. Uchkuma - 14 Сентября, 2010 - 10:53:07 - перейти к сообщению
LEONeso, а для чего тогда регистрация? Зарегистрированный и авторизованный пользователь может удалить свою запись, другие - нет.
4. LEONeso - 14 Сентября, 2010 - 13:25:58 - перейти к сообщению
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
5. AdMeen - 14 Сентября, 2010 - 13:31:52 - перейти к сообщению
LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.


мммм...id записи=id пользователя
6. Uchkuma - 14 Сентября, 2010 - 21:50:07 - перейти к сообщению
LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
Ну тогда все правильно вы придумали, md5 в ссылке.
7. LEONeso - 18 Сентября, 2010 - 15:06:21 - перейти к сообщению
собственно, вот такой код получился у меня, для удаления записи из бд.
PHP:
скопировать код в буфер обмена
  1.     if (isset($_GET['del'])) {
  2.     $del = $_GET['del']; if ($del== '') {unset($del);}
  3.     $result_del = mysql_query ("SELECT * FROM name WHERE md5='$del'",$db);
  4.     $myrow_del = mysql_fetch_array($result_del);
  5.     $md5=$myrow_del['md5'];
  6.     if ($del==$md5 && $myrow_del['status']==0) {
  7.     mysql_query ("DELETE FROM name WHERE md5='$del'",$db);
  8.     echo "true";
  9.         }
  10.     else {echo "false";}
  11.     }


ссылка вида: index.php?del=dadb5d25626ac966a8e9943cb2b684da
md5 добавляется автоматически при добавлении записи, ссылка генерируется и отправляется юзеру на почту, конечно, есть некоторые условия, когда ссылка станет недоступной, помимо ранее удаленной записи.

Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.
8. HotBird - 18 Сентября, 2010 - 16:21:43 - перейти к сообщению
LEONeso пишет:
Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.

У вас $del вставляется в запрос без проверки. А что если я в строке запроса подменю значение del на 1'");?><script>alert('Тынды-рынды')</script>
А что если задать что-то опаснее?
Думаю что если в базе уже хранится значение md5 то лучше будет в переменной передавать значение в обычном виде а скрипт будет его преврящать в md5

а тогда уже проводить запрос с переменной $del.
9. Мелкий - 18 Сентября, 2010 - 16:41:57 - перейти к сообщению
А какой вообще смысл, сначала вытаскивать записи с этим md5, а потом их же удалять? Это же можно всё на БД повесить просто дополнительным условием удаления.
10. LEONeso - 18 Сентября, 2010 - 17:38:56 - перейти к сообщению
Мелкий, Проверить статус нужно. Если 0 то удаляем, если 1, то нет.

HotBird, пораскинул и доступными мне знаниями поправил на следующее:

PHP:
скопировать код в буфер обмена
  1.     if (isset($_GET['del'])) {
  2.     $result_del = mysql_query ("SELECT * FROM name WHERE md5='$del'",$db);
  3.     $myrow_del = mysql_fetch_array($result_del);
  4.     $del = $_GET['del'];
  5.     if ($del==$myrow_del['md5'] && $myrow_del['status']==0) {
  6.     mysql_query ("DELETE FROM name WHERE md5='$del'",$db);
  7.     echo "true";
  8.         } else {
  9.     unset($del);
  10.     echo "false";
  11.         }
  12.     }

(Добавление)
HotBird, в моём коде, что не шаг, так проверки, я не думаю ,что можно как нить навредить, тем более, человек вредит не всем юзерам, а сам себе. Да и приведенный вами пример, не сработал. Подобрать md5 по md5(uniqid(rand(),1)) - возможно, не зная, что за код на странице?
11. Мелкий - 18 Сентября, 2010 - 18:03:09 - перейти к сообщению
LEONeso пишет:
Мелкий, Проверить статус нужно. Если 0 то удаляем, если 1, то нет.

Я понял, для чего это сделано, но зачем?
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM name WHERE md5='$del' AND `status`=0

А если надо узнать, было ли там что-то всё же затронуто, mysql_affected_rows

LEONeso пишет:
в моём коде, что не шаг, так проверки

Где? Не вижу ни одной проверки, кроме проверки на существование и абсолютно бессмысленной проверки на пустую строку, т.к. это проверка предупреждение уровня notice сгенерирует - впоследствии вы обращаетесь к удалённой переменной.
Вариант №2 - ещё круче - сразу notice и абсолютная неработоспособность при отключённых register_globals, а именно в строке 2.
12. LEONeso - 18 Сентября, 2010 - 18:55:48 - перейти к сообщению
Мелкий, я про полный код скрипта, но не этот отрывок =)

я не понял при чем тут mysql_affected_rows, когда мне нужно просто узнать ,что же в двух ячейках.

1. Пользователь переходит по ссылке с его _GET: del=$md5
2. Если найден _GET del то срабатывает условие, открывает базу и используем md5 и status таблицы.
3. Полученные данные из _GET переводятся в переменную del
4. Далее сравниваем данные в переменных del и md5 из бд, если совпадает, то удаляем данную запись.

status - добавляется автоматом и редактируется модератором, по умолчанию 0, при активации 1. При активном статусе, запись является ценной и тем самым, пользователь не может удалить её сам, пока не произойдут определенные события, которые описаны в полном коде.
13. HotBird - 18 Сентября, 2010 - 19:02:03 - перейти к сообщению
LEONeso пишет:
HotBird, в моём коде, что не шаг, так проверки, я не думаю ,что можно как нить навредить, тем более, человек вредит не всем юзерам, а сам себе. Да и приведенный вами пример, не сработал. Подобрать md5 по md5(uniqid(rand(),1)) - возможно, не зная, что за код на странице?

Дело в том что у вас открыта возможность для SQL-инекции. Переменная из строки запроса напрямую вставляется в запрос к базе в строке 2
$result_del = mysql_query ("SELECT * FROM name WHERE md5='$del'",$db);
Тогда нужно хотябы mysql_real_escape_string сделать:

неговоря уже о вырезании скриптов и тегов из значения переменной.
14. Мелкий - 18 Сентября, 2010 - 19:16:04 - перейти к сообщению
LEONeso пишет:
я не понял при чем тут mysql_affected_rows, когда мне нужно просто узнать ,что же в двух ячейках.

Я про то, что не нужно узнавать, что в тех ячейках для алгоритма работы, описанного ниже. С этим делом превосходно справится СУБД, она же система управления. Достаточно указать второе условие и нет нужды дёргать бд повторно.

Ну а полный код/не полный, всё равно:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['del'])) {
  2.     $result_del = mysql_query ("SELECT * FROM name WHERE md5='$del'",$db);
  3.     $myrow_del = mysql_fetch_array($result_del);
  4.     $del = $_GET['del'];

строка 4 смысла здесь не имеет, по логике она должна стоять перед строкой 2.
15. LEONeso - 18 Сентября, 2010 - 19:20:43 - перейти к сообщению
Почитал, поправил:
PHP:
скопировать код в буфер обмена
  1.     if (isset($_GET['del'])) {
  2.     $del = mysql_real_escape_string ($_GET['del']);
  3.     $result_del = mysql_query ("SELECT * FROM name WHERE md5='$del' AND status=0",$db);
  4.     $myrow_del = mysql_fetch_array($result_del);
  5.     if ($del==$myrow_del['md5']) {
  6.     mysql_query ("DELETE FROM name WHERE md5='$del'",$db);
  7.     echo "true";
  8.         } else {
  9.     unset($del);
  10.     echo "false";
  11.         }
  12.     }


но по прежнему, безопасность кода - это страшно сложное дело?

Странно, что переменная del работала и на прежнем месте, хотя ДА, должна стоять перед 2-й строкой. Убрал вывод статуса, вписал его в запрос к бд. Добавил mysql_real_escape_string для переменной del.

status=0 - следует обрамлять кавычками или при числе это не обязательное дело?
(Добавление)
HotBird, получается mysql_real_escape_string следует вписывать и при добавлении данных из форм? Ведь у меня работают они так:

1. Данные из формы отправляются методом _POST
2. Далее _POST становится переменной, с условием, если пустая переменная, то переменная удаляется.
3. Данные переменной добавляются в бд.

т.е.
в данный аналог кода:
PHP:
скопировать код в буфер обмена
  1. $title = $_POST['title'];

должен быть таким?
PHP:
скопировать код в буфер обмена
  1. $title = mysql_real_escape_string($_POST['title']);


мне просто для себя, если да, то естественно в дальнейшем и сейчас, любая переменная которая взаимодействует с базой будет иметь mysql_real_escape_string.

 

Powered by ExBB FM 1.0 RC1