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 :: Удаление записи из бд ссылкой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: ссылка на удаление записи
LEONeso
Отправлено: 13 Сентября, 2010 - 23:00:14
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Как делается ссылка на удаление записи из БД?

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

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

Припоминаем великий рандом =)

(Отредактировано автором: 13 Сентября, 2010 - 23:13:59)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
AdMeen
Отправлено: 14 Сентября, 2010 - 08:09:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




LEONeso пишет:
...

Попробуйте передавать просто уникальный сгенерированный для каждого идентификатор, который методом простого подбора будет крайне сложно подобрать, т.е. примерно как вы и написали, только передавайте id юзера и этот самый uniqid и смотрите, если есть такой юзер с таким ключом, то удаляйте его. а запрос по желанию, как один из вариантов ?action=delete&uid=12&id=blabla

(Отредактировано автором: 14 Сентября, 2010 - 08:12:14)

 
 Top
Uchkuma
Отправлено: 14 Сентября, 2010 - 10:53:07
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




LEONeso, а для чего тогда регистрация? Зарегистрированный и авторизованный пользователь может удалить свою запись, другие - нет.
 
 Top
LEONeso
Отправлено: 14 Сентября, 2010 - 13:25:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
AdMeen
Отправлено: 14 Сентября, 2010 - 13:31:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.


мммм...id записи=id пользователя
 
 Top
Uchkuma
Отправлено: 14 Сентября, 2010 - 21:50:07
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




LEONeso пишет:
не-не-не, никакой регистрации ... просто добавив запись в бд, юзеру приходит письмо, в котором по мимо текста ссылка на удаление записи. нет никаких id пользователя, только id записи.
Ну тогда все правильно вы придумали, md5 в ссылке.
 
 Top
LEONeso
Отправлено: 18 Сентября, 2010 - 15:06:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




собственно, вот такой код получился у меня, для удаления записи из бд.
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 добавляется автоматически при добавлении записи, ссылка генерируется и отправляется юзеру на почту, конечно, есть некоторые условия, когда ссылка станет недоступной, помимо ранее удаленной записи.

Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
HotBird
Отправлено: 18 Сентября, 2010 - 16:21:43
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




LEONeso пишет:
Не знаю как по поводу безопасности, но по моему, ничего страшного нет, везде проверки.

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

а тогда уже проводить запрос с переменной $del.


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
Мелкий Супермодератор
Отправлено: 18 Сентября, 2010 - 16:41:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А какой вообще смысл, сначала вытаскивать записи с этим md5, а потом их же удалять? Это же можно всё на БД повесить просто дополнительным условием удаления.


-----
PostgreSQL DBA
 
 Top
LEONeso
Отправлено: 18 Сентября, 2010 - 17:38:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Мелкий, Проверить статус нужно. Если 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)) - возможно, не зная, что за код на странице?

(Отредактировано автором: 18 Сентября, 2010 - 17:45:52)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
Мелкий Супермодератор
Отправлено: 18 Сентября, 2010 - 18:03:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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.

(Отредактировано автором: 18 Сентября, 2010 - 18:05:15)



-----
PostgreSQL DBA
 
 Top
LEONeso
Отправлено: 18 Сентября, 2010 - 18:55:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Мелкий, я про полный код скрипта, но не этот отрывок =)

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

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

status - добавляется автоматом и редактируется модератором, по умолчанию 0, при активации 1. При активном статусе, запись является ценной и тем самым, пользователь не может удалить её сам, пока не произойдут определенные события, которые описаны в полном коде.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
HotBird
Отправлено: 18 Сентября, 2010 - 19:02:03
Post Id



Гость


Покинул форум
Сообщений всего: 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 сделать:

неговоря уже о вырезании скриптов и тегов из значения переменной.

(Отредактировано автором: 18 Сентября, 2010 - 19:03:42)



-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
Мелкий Супермодератор
Отправлено: 18 Сентября, 2010 - 19:16:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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.


-----
PostgreSQL DBA
 
 Top
LEONeso
Отправлено: 18 Сентября, 2010 - 19:20:43
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Почитал, поправил:
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. Данные переменной добавляются в бд.

т.е.
в данный аналог кода:

должен быть таким?


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

(Отредактировано автором: 18 Сентября, 2010 - 19:26:43)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB