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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Удаление записи из бд ссылкой
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
Как делается ссылка на удаление записи из БД?
Предполагаю, что это метод _GET с условием на странице, где ?delete=md5
так? естественно идет сверка "md5" с данными из таблицы, если таблица найдена с таким md5 то удаляем, ну а "delete" - это своего рода команда для условия (+ сама таблица =) ), типа если $_GET['delete'] появилась, то делаем переменную, записываем в неё уже имеющуюся md5 (по идее она автоматом там будет) и делаем сверку, если условие выполняется, удаляем запись...
Верно я думаю? Собственно смысл такой, дать юзеру удалить свою запись через ссылку, которую ему дают на мыло, но чтоб не организовывать хаус и избежать удаление всего, простым изменением id, то md5 лучше походит для этого дела.
----- Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
AdMeen
Отправлено: 14 Сентября, 2010 - 08:09:23
Посетитель
Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009 Откуда: Воронеж
Помог: 1 раз(а)
LEONeso пишет:
...
Попробуйте передавать просто уникальный сгенерированный для каждого идентификатор, который методом простого подбора будет крайне сложно подобрать, т.е. примерно как вы и написали, только передавайте id юзера и этот самый uniqid и смотрите, если есть такой юзер с таким ключом, то удаляйте его. а запрос по желанию, как один из вариантов ?action=delete&uid=12&id=blabla
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
LEONeso, а для чего тогда регистрация? Зарегистрированный и авторизованный пользователь может удалить свою запись, другие - нет.
LEONeso
Отправлено: 14 Сентября, 2010 - 13:25:58
Посетитель
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
----- Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
AdMeen
Отправлено: 14 Сентября, 2010 - 13:31:52
Посетитель
Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009 Откуда: Воронеж
Помог: 1 раз(а)
LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
мммм...id записи=id пользователя
Uchkuma
Отправлено: 14 Сентября, 2010 - 21:50:07
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
Ну тогда все правильно вы придумали, md5 в ссылке.
LEONeso
Отправлено: 18 Сентября, 2010 - 15:06:21
Посетитель
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
собственно, вот такой код получился у меня, для удаления записи из бд.
mysql_query("DELETE FROM name WHERE md5='$del'",$db);
echo"true";
}
else{echo"false";}
}
ссылка вида: index.php?del=dadb5d25626ac966a8e9943cb2b684da
md5 добавляется автоматически при добавлении записи, ссылка генерируется и отправляется юзеру на почту, конечно, есть некоторые условия, когда ссылка станет недоступной, помимо ранее удаленной записи.
Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.
----- Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
HotBird
Отправлено: 18 Сентября, 2010 - 16:21:43
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
LEONeso пишет:
Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.
У вас $del вставляется в запрос без проверки. А что если я в строке запроса подменю значение del на 1'");?><script>alert('Тынды-рынды')</script>
А что если задать что-то опаснее?
Думаю что если в базе уже хранится значение md5 то лучше будет в переменной передавать значение в обычном виде а скрипт будет его преврящать в md5
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
Мелкий
Отправлено: 18 Сентября, 2010 - 16:41:57
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
А какой вообще смысл, сначала вытаскивать записи с этим md5, а потом их же удалять? Это же можно всё на БД повесить просто дополнительным условием удаления.
----- PostgreSQL DBA
LEONeso
Отправлено: 18 Сентября, 2010 - 17:38:56
Посетитель
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
Мелкий, Проверить статус нужно. Если 0 то удаляем, если 1, то нет.
HotBird, пораскинул и доступными мне знаниями поправил на следующее:
(Добавление) HotBird, в моём коде, что не шаг, так проверки, я не думаю ,что можно как нить навредить, тем более, человек вредит не всем юзерам, а сам себе. Да и приведенный вами пример, не сработал. Подобрать md5 по md5(uniqid(rand(),1)) - возможно, не зная, что за код на странице?
А если надо узнать, было ли там что-то всё же затронуто, mysql_affected_rows
LEONeso пишет:
в моём коде, что не шаг, так проверки
Где? Не вижу ни одной проверки, кроме проверки на существование и абсолютно бессмысленной проверки на пустую строку, т.к. это проверка предупреждение уровня notice сгенерирует - впоследствии вы обращаетесь к удалённой переменной.
Вариант №2 - ещё круче - сразу notice и абсолютная неработоспособность при отключённых register_globals, а именно в строке 2.
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
Мелкий, я про полный код скрипта, но не этот отрывок =)
я не понял при чем тут mysql_affected_rows, когда мне нужно просто узнать ,что же в двух ячейках.
1. Пользователь переходит по ссылке с его _GET: del=$md5
2. Если найден _GET del то срабатывает условие, открывает базу и используем md5 и status таблицы.
3. Полученные данные из _GET переводятся в переменную del
4. Далее сравниваем данные в переменных del и md5 из бд, если совпадает, то удаляем данную запись.
status - добавляется автоматом и редактируется модератором, по умолчанию 0, при активации 1. При активном статусе, запись является ценной и тем самым, пользователь не может удалить её сам, пока не произойдут определенные события, которые описаны в полном коде.
----- Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
HotBird
Отправлено: 18 Сентября, 2010 - 19:02:03
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
LEONeso пишет:
HotBird, в моём коде, что не шаг, так проверки, я не думаю ,что можно как нить навредить, тем более, человек вредит не всем юзерам, а сам себе. Да и приведенный вами пример, не сработал. Подобрать md5 по md5(uniqid(rand(),1)) - возможно, не зная, что за код на странице?
Дело в том что у вас открыта возможность для SQL-инекции. Переменная из строки запроса напрямую вставляется в запрос к базе в строке 2 $result_del = mysql_query ("SELECT * FROM name WHERE md5='$del'",$db);
Тогда нужно хотябы mysql_real_escape_string сделать:
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
Мелкий
Отправлено: 18 Сентября, 2010 - 19:16:04
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
LEONeso пишет:
я не понял при чем тут mysql_affected_rows, когда мне нужно просто узнать ,что же в двух ячейках.
Я про то, что не нужно узнавать, что в тех ячейках для алгоритма работы, описанного ниже. С этим делом превосходно справится СУБД, она же система управления. Достаточно указать второе условие и нет нужды дёргать бд повторно.
но по прежнему, безопасность кода - это страшно сложное дело?
Странно, что переменная del работала и на прежнем месте, хотя ДА, должна стоять перед 2-й строкой. Убрал вывод статуса, вписал его в запрос к бд. Добавил mysql_real_escape_string для переменной del.
status=0 - следует обрамлять кавычками или при числе это не обязательное дело? (Добавление) HotBird, получается mysql_real_escape_string следует вписывать и при добавлении данных из форм? Ведь у меня работают они так:
1. Данные из формы отправляются методом _POST
2. Далее _POST становится переменной, с условием, если пустая переменная, то переменная удаляется.
3. Данные переменной добавляются в бд.
мне просто для себя, если да, то естественно в дальнейшем и сейчас, любая переменная которая взаимодействует с базой будет иметь mysql_real_escape_string.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.