За последние 24 часа нас посетили 22353 программиста и 1637 роботов. Сейчас ищут 910 программистов ...

Практика php.

Тема в разделе "PHP для новичков", создана пользователем shayger, 17 мар 2016.

  1. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    виртуалочку подыми
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Посмотрел, есть такое. Емана, 50р всего требуют.



    • По поводу твоей работы
      • 1. покликал на счетчик, потом нажал назад на браузере, счетчик уменьшается в обратную сторону, и так пока пока не обнулится. Но он конечно сохраняется, но это пока.
      • 2. После регистрации попадаешь на страницу регистрации
      • 3. После авторизации попадаешь на страницу авторизации
      • 4. Не надо хранить в куках ни логин ни пароль
     
  3. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    Мобилку не хочу палить.
    Не знаю как исправить.
    Ну это я уже понял.
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.596
    Симпатии:
    1.764
    Ха. КОгда обновляю страницу, счётчик увеличивается :) Прикольно. Редирект надо делать после записи данных
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Если тебе интересно - сможешь!
    Ковыряй, делай разные варианты! Так набираются опыта!
     
  6. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    Доску с отзывами допишу, и всё исправлю.
     
  7. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    shayger Вообще ты молодец, что стараешься. Все сразу набрасываются на недостатки и не хвалят. Мне не хватало похвалы в то время когда я делал это задание ))) Так что ты молодэц )
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Не набрасываются, а указывают на ошибки. Вообще это отлично когда кто-то смотрит твой код и говорит где что можно улучшить/исправить! ))
    Если это ему поможет, то я присоединяюсь. Shayger, ты маладес!
     
  9. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    Спасибо.
    Согласен.
    Спасибо.

    Добавлено спустя 42 минуты 48 секунд:
    Таки написал. https://github.com/devanonymous/board Логин и пароль модера admin admin. Попробую еще на какой нибудь хостинг закинуть.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.596
    Симпатии:
    1.764
    https://github.com/devanonymous/board/blob/master/m/DB.php#L25 - класс DB (база данных) не должен отвечать за комментарии, за это должна отвечать модель "комментарии". А если у вас там ещё чего появится, тоже всё в класс DB засунете? Из названия DB следует, что этот класс - просто обёртка над стандартной библиотекой баз данных. Вот так получается, когда классы пишутся ради классов

    Добавлено спустя 4 минуты 33 секунды:
    https://github.com/devanonymous/board/blob/master/m/Model.php#L12 - а зачем так сложно-то? Если в сессии лежит логин, значит ты его туда положил, значит не нужно снова запрашивать БД. Сессии привязаны к конкретному пользователю, посему если пользователь прошёл у тебя аутентификацию, логин уже лежит в сессии. А если вышел - логина в сессии нету. Другое дело, защита всякая от угона сессии, но тут тебе пока заморачиваться не надо. И именно потому, что факта наличия логина в сессии достаточно для того, чтобы сказать, что пользователь войдён, и не нужно хранить в сессии пароль. И опять же, класс, отвечающий за аутентификацию не должен называться просто Model

    Добавлено спустя 1 минуту 14 секунд:
    Защиты от повторной отправки форм нигде нету.

    Добавлено спустя 3 минуты 15 секунд:
    Код (PHP):
    1. $query = "INSERT INTO `comments` (`name`, `comment`, `email`, `date`)
    2.             VALUES ('%s', '%s', '%s', '$current_date')";
    3.         mysqli_escape_string($this->db_link, $query);
    4.         $query = sprintf($query, $user_name, $comment, $email);
    5.  
    Это не защищает от sql-инъекций.
    1) весь запрос, а тем более несформированный, нельзя пропускать через функции экранирования. Он станет некорректным. Через функции экранирования пропускаются только значения в него подставляемые
    2) Результат вызова функции mysqli_escape_string ты смываешь в унитаз, посему этот код вообще работает (иначе бы получил ошибку), однако же sql-инъекции возможны всё равно

    Добавлено спустя 3 минуты 57 секунд:
    https://github.com/devanonymous/board/blob/master/c/AdminPanel.php#L30 - не вижу там проверки, залогинен ли я. То есть сделав нехитрый get-запрос можно будет без авторизации делать одобрение комментов
     
  11. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    mkramer Спасибо, всё будет исправлено.
     
  12. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Это что то новое. Всю жизнь думал что экранировать надо весь запрос.

    Добавлено спустя 2 минуты 54 секунды:
    Посмотрел мануал. И вправду надо только значения экранировать.
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну как тебе сказать... если ты работаешь со строками то в твоем запросе будут апострофы для обрамления этих строк. и они будут вдруг экранированы.

    пример:
    Код (PHP):
    1. $tpl = "SELECT '%s' `name`";
    2.         
    3. $name = "Jeanne d'Arc";
    4.         
    5. $bad = sprintf($tpl, $name);
    6. $good = sprintf($tpl, DB::escape($name));
    7. $wtf = DB::escape(sprintf($tpl, $name));
    8.         
    9. printf("%s\n%s\n%s\n\n", $bad, $good, $wtf);
    вывод спецом дам построчно чтоб видно было что происходит в каждом случае:
    бэд
    Код (PHP):
    1. SELECT 'Jeanne d'Arc' `name`
    гуд
    Код (PHP):
    1. SELECT 'Jeanne d\'Arc' `name` 
    втф
    Код (PHP):
    1. SELECT \'Jeanne d\'Arc\' `name`
     
  14. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    mkramer Вроде всё исправил.

    Осталось только это


    https://github.com/devanonymous/board
     
  15. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    1. Открываешь любую тему здесь: https://php.ru/forum/viewforum.php?f=13
    2. Пытаешься решить.
    3. Не получается - берешь другую тему.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.596
    Симпатии:
    1.764
    Да, уже гораздо логичнее всё. Я правда, быстренько смотрю. Если ты эскейпишь значение здесь: https://github.com/devanonymous/board/blob/master/m/DB.php#L48, то не надо эскейпить его здесь: https://github.com/devanonymous/board/blob/master/m/Comments.php#L28. А то будет искажение данных из-за двойного эскейпа.

    Имена колонок эскейпить не надо: https://github.com/devanonymous/board/blob/master/m/DB.php#L53. Во-первых, их не передаёт пользователь, во-вторых, слеши там просто недопустимы, как и апострофы, mysql просто выдаст ошибку

    Не заметил во вьюшках htmlspecialchars, а нужно ставить, а то можно на XSS нарваться.

    По поводу защиты от повторной отправки - так просто же делается. После того, как обработал данные формы, переданной методом post, ничего не выводишь, а просто даёшь редирект на какую-нибудь подходящую страницу. Можно в сессию чегой-нибудь записать, чтоб было видно, что форма успешно прошла. Можно не записывать.
     
  17. Andrey_mdev

    Andrey_mdev Новичок

    С нами с:
    11 мар 2016
    Сообщения:
    24
    Симпатии:
    0
    Можно еще реализовать сайт опросник\голосовалка, где админ создает вопрос с вариантами ответа, а посетители отвечают. Результаты сохраняются в базу. Потом можно посмотреть результаты в виде цветных диаграмм.
    В этой же теме можно подумать над вариантами защиты от роботов и повторных кликов.

    Очень высокий уровень сложности:
    1) Браузерная мультиплеерная игра.
    2) Вариант социальной сети. Личная страница, доска сообщений, переписка, отзывы, загрузка\показ фоток.
     
  18. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    Интересная идея.
     
  19. shayger

    shayger Новичок

    С нами с:
    27 фев 2016
    Сообщения:
    20
    Симпатии:
    0
    Что я должен уметь написать, чтобы устроится на позицию Junior Developer?
     
  20. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    shayger знать теорию и быть готовым к новым знаниям, а то тут многие пишут код, но как делать отладку не знают.
     
  21. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Достаточно немного знать хоть один язык и представлять в общих чертах, как на нём написать что бы вас ни попросили. Уметь составлять алгоритмы.