Посмотрел, есть такое. Емана, 50р всего требуют. По поводу твоей работы 1. покликал на счетчик, потом нажал назад на браузере, счетчик уменьшается в обратную сторону, и так пока пока не обнулится. Но он конечно сохраняется, но это пока. 2. После регистрации попадаешь на страницу регистрации 3. После авторизации попадаешь на страницу авторизации 4. Не надо хранить в куках ни логин ни пароль
Ха. КОгда обновляю страницу, счётчик увеличивается Прикольно. Редирект надо делать после записи данных
shayger Вообще ты молодец, что стараешься. Все сразу набрасываются на недостатки и не хвалят. Мне не хватало похвалы в то время когда я делал это задание ))) Так что ты молодэц )
Не набрасываются, а указывают на ошибки. Вообще это отлично когда кто-то смотрит твой код и говорит где что можно улучшить/исправить! )) Если это ему поможет, то я присоединяюсь. Shayger, ты маладес!
Спасибо. Согласен. Спасибо. Добавлено спустя 42 минуты 48 секунд: Таки написал. https://github.com/devanonymous/board Логин и пароль модера admin admin. Попробую еще на какой нибудь хостинг закинуть.
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): $query = "INSERT INTO `comments` (`name`, `comment`, `email`, `date`) VALUES ('%s', '%s', '%s', '$current_date')"; mysqli_escape_string($this->db_link, $query); $query = sprintf($query, $user_name, $comment, $email); Это не защищает от sql-инъекций. 1) весь запрос, а тем более несформированный, нельзя пропускать через функции экранирования. Он станет некорректным. Через функции экранирования пропускаются только значения в него подставляемые 2) Результат вызова функции mysqli_escape_string ты смываешь в унитаз, посему этот код вообще работает (иначе бы получил ошибку), однако же sql-инъекции возможны всё равно Добавлено спустя 3 минуты 57 секунд: https://github.com/devanonymous/board/blob/master/c/AdminPanel.php#L30 - не вижу там проверки, залогинен ли я. То есть сделав нехитрый get-запрос можно будет без авторизации делать одобрение комментов
Это что то новое. Всю жизнь думал что экранировать надо весь запрос. Добавлено спустя 2 минуты 54 секунды: Посмотрел мануал. И вправду надо только значения экранировать.
ну как тебе сказать... если ты работаешь со строками то в твоем запросе будут апострофы для обрамления этих строк. и они будут вдруг экранированы. пример: Код (PHP): $tpl = "SELECT '%s' `name`"; $name = "Jeanne d'Arc"; $bad = sprintf($tpl, $name); $good = sprintf($tpl, DB::escape($name)); $wtf = DB::escape(sprintf($tpl, $name)); printf("%s\n%s\n%s\n\n", $bad, $good, $wtf); вывод спецом дам построчно чтоб видно было что происходит в каждом случае: бэд Код (PHP): SELECT 'Jeanne d'Arc' `name` гуд Код (PHP): SELECT 'Jeanne d\'Arc' `name` втф Код (PHP): SELECT \'Jeanne d\'Arc\' `name`
1. Открываешь любую тему здесь: https://php.ru/forum/viewforum.php?f=13 2. Пытаешься решить. 3. Не получается - берешь другую тему.
Да, уже гораздо логичнее всё. Я правда, быстренько смотрю. Если ты эскейпишь значение здесь: 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, ничего не выводишь, а просто даёшь редирект на какую-нибудь подходящую страницу. Можно в сессию чегой-нибудь записать, чтоб было видно, что форма успешно прошла. Можно не записывать.
Можно еще реализовать сайт опросник\голосовалка, где админ создает вопрос с вариантами ответа, а посетители отвечают. Результаты сохраняются в базу. Потом можно посмотреть результаты в виде цветных диаграмм. В этой же теме можно подумать над вариантами защиты от роботов и повторных кликов. Очень высокий уровень сложности: 1) Браузерная мультиплеерная игра. 2) Вариант социальной сети. Личная страница, доска сообщений, переписка, отзывы, загрузка\показ фоток.
shayger знать теорию и быть готовым к новым знаниям, а то тут многие пишут код, но как делать отладку не знают.
Достаточно немного знать хоть один язык и представлять в общих чертах, как на нём написать что бы вас ни попросили. Уметь составлять алгоритмы.