За последние 24 часа нас посетили 32894 программиста и 1755 роботов. Сейчас ищут 847 программистов ...

проблема с copy($_FILES)

Тема в разделе "PHP и базы данных", создана пользователем oksana, 17 мар 2012.

  1. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    помогите девушке сама не пойму!

    вот такая форма для пользователей к примеру:
    <form enctype="multipart/form-data" action="../test.info/obr.php" method="post">
    <input type="file" name="foto">
    <input type="submit">
    </form>

    есть таблица в БД img

    а вот сам PHP:

    if ($foto !== " "){
    copy($_FILES["foto"]["tmp_name"],"../test.info/files/".$_FILES["foto"]["name"]);
    }
    $result = mysql_query ("INSERT INTO img (foto) VALUES ('$foto')");

    А вот вопрос:

    в таблицу img в поле foto попадает пустота
    а если в форме убираю enctype="multipart/form-data" то в поле фото попадает имя файла,
    но файл не копируется в папку

    в файле php.ini убрала register_globals = Off на register_globals = On,
    файл сохраняется и попадает в поле foto но там не то
    отправляла 34363.jpg а сохранилось mpphp99.tmp

    Люди подскажите?
     
  2. aspirin

    aspirin Активный пользователь

    С нами с:
    17 мар 2012
    Сообщения:
    12
    Симпатии:
    0
    Если я всё правильно понял, то попробуйте вот это (предупреждаю что это код без проверок и он уязвим)
    HTML:
    Код (Text):
    1.  
    2. <form enctype="multipart/form-data" action="../test.info/obr.php" method="post">
    3. <input type="file" name="foto">
    4. <input type="submit">
    5. </form>
    PHP:
    Код (Text):
    1.  
    2.         // Если в массиве существует элемент foto
    3.         if (isset($_FILES['foto']))
    4.         {
    5.             // Перемещаем из временной директории
    6.             move_uploaded_file($_FILES['foto']['tmp_name'], "../test.info/files/".$_FILES["foto"]['name']);
    7.             // Записываем имя файла
    8.             $result = mysql_query("INSERT INTO img (foto) VALUES ('{$_FILES["foto"]['name']}')");
    9.         }
    register_global - зло, поверьте это вам не нужно!
    Для перемещения файла из временной директории используйте функцию move_uploaded_file, также советую прочитать эту статью.
     
  3. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Спасибо большое! Шас проверю.

    Добавлено спустя 18 минут 16 секунд:
    Спасибо спаибо. Вы мой спаситель!
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  5. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    вы извините конечно за ( не плодите темы и жить будет легче ) просто думала так быстрее кто то ответит
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну вот, прохлопали ответ =) который был дан почти сразу, как темы наплодились =)
     
  7. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    А почему погубитель? Проверку сделала чтоб файл был формата JPEG JPG GIF PNG вродебы все работает как надо
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он же написал =)
    и ты не уделила этому внимания. Это все равно что дать гранату ребенку и сказать, чтобы чеку не дергал.
    вот:
    если посмотришь на мой, увидишь там странный конструктив в части запроса где данные которые заносить
    ('".mysql_real_escape_string($_FILES["foto"]["name")."')
    без этой функции любой может подставить на место имени файла (а это не сложно) другой запрос в базу данных. например, убить все фотки. И он выполнится, т.к. ты пишешь его без оглядки прямо в запрос.

    опастносте!
     
  9. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Ок, больше не буду давать ребенку гранату =)
    А я даже незнала что можно сделать так чтоб все фотки удалились
    А проверка чтоб на конце файла было .JPG не помогает?
     
  10. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Проверка на JPG проверяет расширение загружаемого файла, хотя интересно было бы посмотреть на код...

    Вам же говорят про sql injection что гораздо хуже
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. ребенка в данном случае это ты =)
     
  12. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    вот вы напали на меня я же знала про такие штучки ч только учусь =)

    Добавлено спустя 3 минуты 34 секунды:
    А что значит в поле <textarea></textarea> тоже могут сделать запрос чтоб фотки удалились?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет, это вина аспирина

    всё что в базу пишется нужно экранировать тем или иным образом.
     
  14. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    шас все исправлю и отправлю =)

    Добавлено спустя 37 минут 22 секунды:
    ВОТ HTML
    Код (Text):
    1. <form enctype="multipart/form-data" action="../test.info/obrabotka.php" method="post">
    2. <table>
    3. <tr>
    4. <td><label for="type">Тип объявления</label></td>
    5. <td><input checked name="type" type="radio" value="ПРОДАЮ">Продаю<input name="type" type="radio" value="КУПЛЮ">Куплю</td>
    6. </tr>
    7. <tr>
    8. <td><label for="info">Коротко о товаре</label></td>
    9. <td><input maxlength="45" type="text" name="info" id="name"></td>
    10. </tr>
    11. <tr>
    12. <td><label for="tovar">Выберите товар</label></td>
    13. <td><select name="tovar">
    14.     <option>туфли</option>
    15.     <option>платья</option></select>
    16. </td>
    17. </tr>
    18. <tr>
    19. <td><label for="sost">Выберите состояние</label></td>
    20. <td><select name="sost">
    21.     <option>новое</option>
    22.     <option>б/у</option></select>
    23. </td>
    24. </tr>
    25. <tr>
    26. <td><label for="period">Срок размещения</label></td>
    27. <td><select name="period">
    28. <option>30 дней</option>
    29. <option>60 дней</option>
    30. </select></td>
    31. </tr>
    32. <tr>
    33. <td><label for="prise">Цена в рублях</label></td>
    34. <td><input maxlength="9" type="text" name="prise"></td>
    35. </tr>
    36. <tr>
    37. <td><label for="img">Выберите фото 1</label></td>
    38. <td><input name="img" type="file"></td>
    39. </tr>
    40. <tr>
    41. <td><label for="text">Полный текст объявления</label></td>
    42. <td><textarea name="text" cols="40" rows="5"></textarea></td>
    43. </tr>
    44. <tr>
    45. <td><label for="gorod">Выберите город</label></td>
    46. <td><select name="gorod">
    47. <option>Москва</option>
    48. <option>С-Петербург</option></select>
    49. </td>
    50. </tr>
    51. <tr>
    52. <td><label for="name">Контактное лицо</label></td>
    53. <td><input maxlength="40" type="text" name="name"></td>
    54. </tr>
    55. <tr>
    56. <td><label for="phone">Введите номер телефона</label></td>
    57. <td><input maxlength="11" type="text" name="phone"></td>
    58. </tr>
    59. <tr>
    60. <td><input name="submit" type="submit" value="Добавить объявление"></td>
    61. <td><input type="reset" value="Удалить данные"></td>
    62. </tr>
    63. </table>
    64. </form>
    А ВОТ PHP
    Код (Text):
    1. $db = mysql_connect("localhost", "php", "12345");
    2. mysql_select_db("test", $db);
    3.  
    4. $date = date("d-m-Y");
    5.  
    6. $time = date("H:i:s");
    7.  
    8. // если существуют такие переменные то
    9. if (isset($type) && isset($info) && isset($tovar) && isset($sost) && isset($period) && isset($prise) && isset($text) && isset($gorod) && isset($name) && isset($phone)){
    10.  
    11. // проверка на введение номера цены
    12. if(!preg_match("/^[0-9]{1,9}+$/", $_POST['prise'])){
    13. echo ("<p>Цена заданна в неверном формат(Вернитесь назад и исправьте цену)</p>");
    14. }
    15.  
    16. // проверка на введение телефона
    17. else if(!preg_match("/^[0-9]{6,11}+$/", $_POST['phone'])){
    18. echo ("<p>Телефон задан в неверном формате!(Вернитесь назад и исправьте телефон)</p>");
    19. }
    20.  
    21. else if(!preg_match("[^\s]+(?=\.(jpg|gif|png))\.\2", $_POST['img'])){
    22. echo ("<p>некоректный файл</p>");
    23. }
    24.  
    25. // то добавляем в таблицу переменные
    26. else {
    27. if (isset($_FILES['img']) && !$_FILES['img']['error']){
    28.  
    29. // Перемещаем из временной директории
    30. copy($_FILES['img1']['tmp_name'], "../test.info/files/".$_FILES['img1']['name']);};
    31.    
    32. $result = mysql_query ("INSERT INTO table (type, info, tovar, sost, period, prise, text, gorod, name, phone, img, date, time) VALUES ('$title', '$marca', '$sost', '$period', '$type', '$prise', '$text', '$gorod', '$name', '$phone', '".mysql_real_escape_string($_FILES["img"]["name"])."', '$date', '$time')");
    33. }
    34. }
    35. else{
    36. echo "<p>Вы заполнили не все поля!(Вернитесь назад и заполните пропущенные поля)</p>";
    37. }
    38. ?>
    Что еще можно добавить для безопастности?
     
  15. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А вы не все данные фильтруете как я вижу только $_FILES["img"]["name"]

    Код (Text):
    1.  
    2. $result = mysql_query ("INSERT INTO table (type, info, tovar, sost, period, prise, text, gorod, name, phone, img, date, time) VALUES ('$title', '$marca', '$sost', '$period', '$type', '$prise', '$text', '$gorod', '$name', '$phone', '".mysql_real_escape_string($_FILES["img"]["name"])."', '$date', '$time')");
    или фильтрация происходит в другом месте?

    Добавлено спустя 15 минут 10 секунд:
    А проверять тип файла через $_FILES['img']['type'] не хотите?
     
  16. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    А как делать фильтрацию других данных, ".mysql_real_escape_string($_POST["title"]["name"])." ?

    А как проверять тип файла через $_FILES['img']['type'] можно по подронее please ?
     
  17. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Да фильтровать через mysql_real_escape_string.

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

    http://www.w3schools.com/php/php_file_upload.asp
     
  18. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Спасибо если бы не форум не знала бы что делать =)
     
  19. aspirin

    aspirin Активный пользователь

    С нами с:
    17 мар 2012
    Сообщения:
    12
    Симпатии:
    0
    я же предупреждал :) просто я ответил непосредственно на вопрос. Вопросы безопасности это достаточно широкая тема
     
  20. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Всеровно спасибо aspirin просто я новичок в PHP училась по уроков Евгения Попова

    Добавлено спустя 51 секунду:
    урокам
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    попова забудь как страшный соню

    покажи что получилось?
     
  22. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    А что посоветуете чтоб я знала PHP как вы? И только чтоб не слишком замудрено америку открывать не собираюсь.

    Добавлено спустя 6 минут 47 секунд:
    А что именно показать =) ?
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чтобы изучить пхп не мудрено, надо просто писать на аглицком свой вопрос или задачу в гугель. В 99% случаев на первой же странице можно найти пяток готовых решений. Обычно все задачи начинающего программиста уже обсосаны и решения весьма распространены.
    Все что не понятно - тащи сюда и спрашивай. Тут разъяснят быстро.

    только пожалуйста, работай сразу в нормальном редакторе. типа netbeans
     
  24. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    igordata я пишу в dreamweaver cs5 вроде неплохо ошибки в строках показывает, а вы как считаете?
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я считаю, что лучше в нем не работать. =)