За последние 24 часа нас посетили 17558 программистов и 1723 робота. Сейчас ищут 1857 программистов ...

Мой первый сайт на PHP

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 29 май 2017.

  1. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Спокойно) автор исправляется, и я ему уже указал на эту конструкцию и на то, почему ее не надо юзать. Но да, этот сниппет как чума.
    Говорят, его активно пиарит Евгеша Попович.
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Стоит ли так тримить?

    PHP:
    1. $sth->bindValue(':name', trim($text), PDO::PARAM_STR);
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну здесь просто постоянно это постят, каждый новичок, кто приходит. Я не против ТС, я про эту чушь. Может сделаем тему закреплённую про это, чтоб ссылку кидать? Моя первая защита от SQL-инъекции тоже смешная была, но она от них действительно защищала (я где-то прочитал рекомендацию http://www.php.net/bin2hex использовать, а базу заставлять раскодировать)


    Это имеет смысл, да, если эти пробелы не нужны
     
    igordata нравится это.
  4. igordata

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

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

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Советую в базе для status и answer задать значения по дефолту чтобы в запросе их не вбивать.
    И вообще, почему все забиндил, а этих обделил? Или ноль и налл не биндятся?
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    А смысл их биндить?
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Dimon2x, чтобы одинаково было. Тогда задай дефолтные значения.
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Сделал вот так, пойдёт ли?

    PHP:
    1. class DataBase {
    2.     public static function connect ($host, $dbname, $user, $pass) {
    3.         try {
    4.             $db = new PDO('mysql:host='.$host.'; dbname='.$dbname.'; charset=utf8', $user, $pass);
    5.         }
    6.        
    7.         catch (PDOException $e) {
    8.             if(file_exists('error.txt')) {
    9.                 if($countError = file_get_contents('error.txt', NULL, NULL, 19, 2)) {
    10.                     $countErrorFile = fopen('countError.txt', 'w');
    11.                     fwrite($countErrorFile, $countError);
    12.                
    13.                     $readCountError = file_get_contents('countError.txt', NULL, NULL, 0, 2);
    14.            
    15.                     $fp = fopen('error.txt', 'w');
    16.                     fwrite($fp, 'Count bad requests ');
    17.                     fwrite($fp, $readCountError+1);
    18.                     fwrite($fp, ' . Error = ');
    19.                     fwrite($fp, $e->getMessage());
    20.                 }
    21.                
    22.                 else {
    23.                     $countError = file_get_contents('error.txt', NULL, NULL, 19, 2);
    24.                     $fp = fopen('error.txt', 'w');
    25.                 }
    26.             }
    27.             else {
    28.                 $fp = fopen('error.txt', 'w');
    29.                 fwrite($fp, 'Count bad requests 1 ');
    30.                 fwrite($fp, $e->getMessage());
    31.                
    32.             }
    33.             die('Не удалось подключиться к базе данных');
    34.         }
    35.         return $db;
    36.     }
    37. }

    В файле, будет написано Count bad requests 9 . Error = SQLSTATE[HY000] [1045] Access denied for user 'faq'@'localhost' (using password: YES)

    Цифра 9 означает, что 9 пользователей, не смогли подключится к базе, только я сделал счётчик до 100, в принципе, мне этого хватает, чтобы принять меры.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ды не надо пользователю описывать суть проблемы) Он может даже не знать, что такое база данных. "Произошла непредвиденная ошибка". Все. Этого за глаза.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Что-то сложная слишком запись ошибки в лог. Автор, есть флаг a+ у fopen, и не надо будет проверять существование файла, лишь бы папка была доступна для записи
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    с флагом a+, содержимое файла будет увеличиваться.
    --- Добавлено ---
    Я сократил код, теперь счётчик работает до бесконечности

    PHP:
    1. catch (PDOException $e) {
    2.             if(!file_exists('countError.txt')) {
    3.                 $countErrorFile = fopen('countError.txt', 'w');
    4.                 fwrite($countErrorFile, 1);
    5.                 $fp = fopen('error.txt', 'w');
    6.                 fwrite($fp, 'Count bad requests ');
    7.                 fwrite($fp, 1);
    8.                 fwrite($fp, '. Error = ');
    9.                 fwrite($fp, $e->getMessage());
    10.             }
    11.            
    12.             else {
    13.                 $readCountError = file_get_contents('countError.txt', NULL, NULL, 0);
    14.                 $countErrorFile = fopen('countError.txt', 'w');
    15.                 fwrite($countErrorFile, $readCountError + 1);
    16.                
    17.                 $fp = fopen('error.txt', 'w');
    18.                 fwrite($fp, 'Count bad requests ');
    19.                 fwrite($fp, $readCountError + 1);
    20.                 fwrite($fp, '. Error = ');
    21.                 fwrite($fp, $e->getMessage());
    22.             }
    23.        
    24.             die('<p>Произошла ошибка</p>');
    25.         }
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    В этом суть логов.
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    А мне это не надо, в мой лог будет записываться только ошибка подключения и я хочу знать, количество этих ошибок, бессмысленно заполнять файл, одной и той же ошибкой
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    В. Этом. Суть. Логов.
    --- Добавлено ---
    Серьезно. Открой access-лог сервера, ты охренеешь от тысяч строк мусора в нем. Но это нормально. Лог не должен иметь сложную логику работы. Он должен просто складировать строчки и не мешать приложению работать.
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    10)Здесь и далее
    PHP:
    1. <a href="?interface-admin=1&del-id='.$admin['id'].'">Удалить</a>'
    Подобные конструкции - это CSRF-уязвимость. Я могу прям вот тут в тело этого сообщения закинуть картинку, у которой src будет равен запросу определенному. Ты, просто открыв сообщение на этом форуме, просто вот увидев это сообщение, сам того не подозревая выполнишь то, что я прописал в ссылке. Браузер отправит запрос на сайт, и, если ты там залогинен с правами администратора, запрос отработает в штатном режиме, как если бы ты сам руками нажал на нужную кнопку. Как пример, с использованием цитируемого кода я могу твоими руками удалить чужую учетную запись.
    [/QUOTE]

    Я так и не понял, как эта картинка будет работать, если запрос работает по параметру del-id? А в картинке его не будет.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Будет.
    HTML:
    1. <img src="http://твой-сайт.рф?interface-admin=1&del-id=1">
    И если у тебя будет авторизирован админ, всё, пипец пользователю с id=1. А это обычно админ
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Почему не будет? Суть в том, что я ж буду не картинку вставлять, прям жипег. А просто в src напишу гет запрос нужный. Твой браузер, открывая страницу, соберет все теги img, у них соберет все src и запустит их в асинхронный загруз. В том числе и src, который дал я. Каждый такой загруз - это просто запрос по указанному URL с целью получить оттуда картинку в ответ. Если картинки нет, ой, src неправильный. Бразуер отобразит иконку битого изображения. Но запрос на твой сервер уже ушел. И уже вернул ответ. Он уже выполнился. А покуда ты там был залогинен, запрос прошел все проверки доступа.
     
    Dimon2x нравится это.
  18. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    сейчас проверю
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Я помню, такой факап был, в свое время у вконтакта раннего. У них вся пользовательская админка была на гетзапросах. Причем, унифицированных для всех, без токенов безопасности и тд. Картинки счастья, сносящие учетки, меняющие личне данные, добавляющие тебя в друзья к хренпоймикому нет нет, да всплывали на сильно посещаемых форумах.

    А еще был "CSRF-вирус". Ссылка в "Мой сайт", по клике на которую открывался совершенно левый сайт, содержащий атаку на твой аккаунт, суть которой...прописывание ссылки на этот сайт в твой "мой сайт" в анкете. А ты и не замечаешь. В итоге ссыль на левый сайт обрастала нехилой такой массой внешней :)

    Золотое время...
     
  20. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Создал отдельный файл в корне сайта, и в него поместил
    HTML:
    1. <img src="http://localhost/dashboard/netology/sait/?interface-admin=1&del-id=5">
    Открыл и удаление не сработало
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ты вошёл как админ?
     
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    а не, сработало
    --- Добавлено ---
    и как тут быть?
     
    Fell-x27 нравится это.
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    зайди как админ, потом зайди на страничку с такой "картинкой"
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Запросы на удаление и разлогинивание - только методом POST. Делается через создание формы - явное или не явное, и простой javascript, если надо, чтоб выглядело как ссылка.
     
  25. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Ну а как же быть, со статьями, там же такая же схема, например, пользователь хочет удалить статью, для интереса заходит в исходник и видит там ссылку del-question=2 и изменяет 2 на 50 и удаляется статья другого пользователя.