Jump to content
  • 0

Основы. Вопрос начинающего


Yazon_Nile
 Share

Question

Всем привет.
С недавнего времени взялся за изучение php. Поставил себе простую задачу. Решил её. Но тут же возник вопрос, а правильно ли? Т.к решение подсказало js-ерское сознание :) и не понятно, как решаются подобные вещи правильно.

 

Интересует правильность решения со стороны поставленной задачи.

 

 

Дано

index.php - форма с одним input[type=file];

result.php - страница, где отображаем имя загруженного файла и ссылку на удаление файла;

remove.php - страница, что удаляет файл и редиректит на index.

 

index.php

<!DOCTYPE html><html><head><title>form upload</title></head><body>	<form method="post" action="result.php" enctype="multipart/form-data">		<fieldset>			Choose your file: <input type="file" name="filename" size="10"> <br>			<input type="submit">		</fieldset>	</form></body></html>

result.php

<?phpecho <<<_END<!DOCTYPE html><html><head><title>result page</title></head><body>_END;$name = htmlentities($_FILES['filename']['name']);move_uploaded_file($_FILES['filename']['tmp_name'], $name);echo "<a href='remove.php?to_remove=$name'>remove</a><br>";echo "$name uploaded!";echo "</body></html>";?>

remove.php

<?php	extract($_REQUEST);	if(!unlink($to_remove)) echo "can`t";	else {		header("Location: index.php");		die();	};?>

Интерисует момент именно с удалением файла.
Т.е я сформировал ?key=value ссылку, откуда и вытащил имя файла.
Это правильное решение? Или это делается по-другому?

 

Чем чреват этот метод?

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

В данном примере, наверное, ничего.

 

Но как поступать если к примеру у меня 10 файлов на странице. У каждого своя ссылка на удаление.
Принцип формирования ссылки такой же? Имя файла в ключе + переход на remove.php??

Link to comment
Share on other sites

  • 0

ну для начала нужно сделать проверку на существования файла через file_exists()

а вообще конечно пишут нечто вроде (но это как кому):

<?php$uploaddir = './uploads/';$file = $uploaddir . basename($_FILES['uploadfile']['name']); if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file)) {	echo "success"; } else {	echo "error";}?>

по поводу принципа формирования, можно вот так например:

<?<a href="del.php?act=drop_photo">if(isset($_GET['act']) && $_GET['act'] == 'drop_photo') {  unset($file); // тут уже сразу и путь к папке и к файлу}?>

хотя тут наверное не помешал бы доп параметр для определения самого файла который будет удаляться.

так то в принципе все правильно, только не забывайте про проверки на наличие, на тип файла и т.д...

с 10 файлами в цикле через foreach($file as $key=>$val) {...}

  • Like 1
Link to comment
Share on other sites

  • 0

Ещё один нубский вопрос :)

 

Юзер залогинивается.
Запускается сессия, и если выбрана галочка "Запомнить" - пишется кука 'logged_in'

Как теперь вытащить его username и остальные данные из БД? К примеру, чтобы показать его профиль.

 

Единсвенный вариант, что я смог придумать - записывать в куку 'loggen_in', к примеру id юзера. Сразу и проверка на наличие куки + можно найти юзера в базе.

Это правильный выход, или есть получше?

Edited by Yazon_Nile
Link to comment
Share on other sites

  • 0

Ещё один нубский вопрос :)

 

Юзер залогинивается.

Запускается сессия, и если выбрана галочка "Запомнить" - пишется кука 'logged_in'

Как теперь вытащить его username и остальные данные из БД? К примеру, чтобы показать его профиль.

 

Единсвенный вариант, что я смог придумать - записывать в куку 'loggen_in', к примеру id юзера. Сразу и проверка на наличие куки + можно найти юзера в базе.

Это правильный выход, или есть получше?

Неправильно, а если точнее, крайне небезопасно. Нельзя доверять данным полученным от пользователя. В данном случае, можно изменить значение куки 'loggen_in' на 1, к примеру, и с большей вероятностью, будет получен доступ к аккаунту админа.

Запуская сессию, логичнее хранить данные в сессии.

  • Like 1
Link to comment
Share on other sites

  • 0

Уважаемый DivMan, удостойте, пожалуйста, вниманием название раздела, которому принадлежит данная тема. Надеюсь, ваше негодование по данному вопросу исчезнет. 

а да забыл, просто привык то что в  последние сообщения в темах: в основном про HTML и CCS, извините 

Edited by DivMan
Link to comment
Share on other sites

  • 0

Запуская сессию, логичнее хранить данные в сессии.

 

согласен. Но поясните плз дальнеишие действия.

 

Изначально у нас сессии нет.

После залогинивания мы запускаем сессию и пишем в $_SESSION['user_id'] нужный идентификатор.

Также записываем куку logged_in = 1

 

Пока сессия активна - мы юзаем user_id из сессии, для получения данных по юзеру из БД. Все хорошо и удобно.

 

Сессия закончилась - user_id недоступна.

До сих пор доступна кука logged_in.

 

Но что она нам дает? Юзер заходит на страницу, сервер видит, что кука logged_in есть. Но ничего более. Как он определит, что именно за юзер зашел на сайт?

 

Зы. вероятно я чего-то не понимаю во всей этой схеме кукисы/сессии

буду благодарен за пояснения.

в догонку.

 

 

Нельзя доверять данным полученным от пользователя. В данном случае, можно изменить значение куки 'loggen_in' на 1, к примеру, и с большей вероятностью, будет получен доступ к аккаунту админа.

 

Этот айдишник мы получаем из БД. Он генерится auto increment`om

Link to comment
Share on other sites

  • 0

Один из вариантов:

1) Создаем в таблице users поле, например, user_auth

2) Каждый раз при аутентификации пользователя генерируем токен, например вот так: md5(uniqid(mt_rand(), true));

3) Записываем полученный хеш в user_auth и ставим 2 куки с user_id и user_auth(куки ставим с флагом httponly, в целях профилактики от возможных xss-векторов)

4) Когда юзер заходит на страницу, смотрим user_id, сверяем хеши, если хеши не совпадают - не пускаем, просим залогиниться.

 

 

Этот айдишник мы получаем из БД. Он генерится auto increment`om

 

Но вы храните его в куках чтобы идентифицировать пользователя. А пользователь имеет возможность произвольно изменять значение куки, тем самым выдавая себя за другого.

Edited by wendigo
  • Like 1
Link to comment
Share on other sites

  • 0

 

Запуская сессию, логичнее хранить данные в сессии.

 

согласен. Но поясните плз дальнеишие действия.

 

Изначально у нас сессии нет.

После залогинивания мы запускаем сессию и пишем в $_SESSION['user_id'] нужный идентификатор.

Также записываем куку logged_in = 1

 

Пока сессия активна - мы юзаем user_id из сессии, для получения данных по юзеру из БД. Все хорошо и удобно.

 

Сессия закончилась - user_id недоступна.

До сих пор доступна кука logged_in.

 

Но что она нам дает? Юзер заходит на страницу, сервер видит, что кука logged_in есть. Но ничего более. Как он определит, что именно за юзер зашел на сайт?

 

Зы. вероятно я чего-то не понимаю во всей этой схеме кукисы/сессии

буду благодарен за пояснения.

в догонку.

 

 

Нельзя доверять данным полученным от пользователя. В данном случае, можно изменить значение куки 'loggen_in' на 1, к примеру, и с большей вероятностью, будет получен доступ к аккаунту админа.

 

Этот айдишник мы получаем из БД. Он генерится auto increment`om

 

Вы все правильно понимаете, и написали все примерно верно, но все это можно сделать и без кук.

Вот пример с пыхи: http://old.pyha.ru/articles/php/auth/

  • Like 1
Link to comment
Share on other sites

  • 0

Интересно, как вы все это хотите сделать без кук? В примере с пыхи куки используются.

Можно воспользоваться местом для хранения информации на стороне клиента, но это поддерживается только новыми браузерами и то не всеми вроде как.

Можно сделать скачиваемый ключ-файл, который будет лежать скажем на диске C:\ но тут нужно учесть, что не у всех винды и нужно указывать где лежит файлик ключа, а для этого думаю опять же куки понадобятся.

Еще можно сделать адрес для авторизации, дабы каждый раз не вводить логин пароль, просто посещать страничку добавленную в избранное, на которой будет передаваться хэш вашей авторизации.

Link to comment
Share on other sites

  • 0

кхм..., да, не совсем верное высказался, я имел ввиду что использовать remember вовсе не обязательно, т.к. большинство браузеров это и так умеют, а пример с пыхи привел, что бы Т.С. было понятно как вообще подобные ещи реализовывать.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy