Спокойно) автор исправляется, и я ему уже указал на эту конструкцию и на то, почему ее не надо юзать. Но да, этот сниппет как чума. Говорят, его активно пиарит Евгеша Попович.
Ну здесь просто постоянно это постят, каждый новичок, кто приходит. Я не против ТС, я про эту чушь. Может сделаем тему закреплённую про это, чтоб ссылку кидать? Моя первая защита от SQL-инъекции тоже смешная была, но она от них действительно защищала (я где-то прочитал рекомендацию http://www.php.net/bin2hex использовать, а базу заставлять раскодировать) Это имеет смысл, да, если эти пробелы не нужны
Советую в базе для status и answer задать значения по дефолту чтобы в запросе их не вбивать. И вообще, почему все забиндил, а этих обделил? Или ноль и налл не биндятся?
Сделал вот так, пойдёт ли? PHP: class DataBase { public static function connect ($host, $dbname, $user, $pass) { try { $db = new PDO('mysql:host='.$host.'; dbname='.$dbname.'; charset=utf8', $user, $pass); } catch (PDOException $e) { if(file_exists('error.txt')) { if($countError = file_get_contents('error.txt', NULL, NULL, 19, 2)) { $countErrorFile = fopen('countError.txt', 'w'); fwrite($countErrorFile, $countError); $readCountError = file_get_contents('countError.txt', NULL, NULL, 0, 2); $fp = fopen('error.txt', 'w'); fwrite($fp, 'Count bad requests '); fwrite($fp, $readCountError+1); fwrite($fp, ' . Error = '); fwrite($fp, $e->getMessage()); } else { $countError = file_get_contents('error.txt', NULL, NULL, 19, 2); $fp = fopen('error.txt', 'w'); } } else { $fp = fopen('error.txt', 'w'); fwrite($fp, 'Count bad requests 1 '); fwrite($fp, $e->getMessage()); } die('Не удалось подключиться к базе данных'); } return $db; } } В файле, будет написано Count bad requests 9 . Error = SQLSTATE[HY000] [1045] Access denied for user 'faq'@'localhost' (using password: YES) Цифра 9 означает, что 9 пользователей, не смогли подключится к базе, только я сделал счётчик до 100, в принципе, мне этого хватает, чтобы принять меры.
Ды не надо пользователю описывать суть проблемы) Он может даже не знать, что такое база данных. "Произошла непредвиденная ошибка". Все. Этого за глаза.
Что-то сложная слишком запись ошибки в лог. Автор, есть флаг a+ у fopen, и не надо будет проверять существование файла, лишь бы папка была доступна для записи
с флагом a+, содержимое файла будет увеличиваться. --- Добавлено --- Я сократил код, теперь счётчик работает до бесконечности PHP: catch (PDOException $e) { if(!file_exists('countError.txt')) { $countErrorFile = fopen('countError.txt', 'w'); fwrite($countErrorFile, 1); $fp = fopen('error.txt', 'w'); fwrite($fp, 'Count bad requests '); fwrite($fp, 1); fwrite($fp, '. Error = '); fwrite($fp, $e->getMessage()); } else { $readCountError = file_get_contents('countError.txt', NULL, NULL, 0); $countErrorFile = fopen('countError.txt', 'w'); fwrite($countErrorFile, $readCountError + 1); $fp = fopen('error.txt', 'w'); fwrite($fp, 'Count bad requests '); fwrite($fp, $readCountError + 1); fwrite($fp, '. Error = '); fwrite($fp, $e->getMessage()); } die('<p>Произошла ошибка</p>'); }
А мне это не надо, в мой лог будет записываться только ошибка подключения и я хочу знать, количество этих ошибок, бессмысленно заполнять файл, одной и той же ошибкой
В. Этом. Суть. Логов. --- Добавлено --- Серьезно. Открой access-лог сервера, ты охренеешь от тысяч строк мусора в нем. Но это нормально. Лог не должен иметь сложную логику работы. Он должен просто складировать строчки и не мешать приложению работать.
10)Здесь и далее PHP: <a href="?interface-admin=1&del-id='.$admin['id'].'">Удалить</a>' Подобные конструкции - это CSRF-уязвимость. Я могу прям вот тут в тело этого сообщения закинуть картинку, у которой src будет равен запросу определенному. Ты, просто открыв сообщение на этом форуме, просто вот увидев это сообщение, сам того не подозревая выполнишь то, что я прописал в ссылке. Браузер отправит запрос на сайт, и, если ты там залогинен с правами администратора, запрос отработает в штатном режиме, как если бы ты сам руками нажал на нужную кнопку. Как пример, с использованием цитируемого кода я могу твоими руками удалить чужую учетную запись. [/QUOTE] Я так и не понял, как эта картинка будет работать, если запрос работает по параметру del-id? А в картинке его не будет.
Будет. HTML: <img src="http://твой-сайт.рф?interface-admin=1&del-id=1"> И если у тебя будет авторизирован админ, всё, пипец пользователю с id=1. А это обычно админ
Почему не будет? Суть в том, что я ж буду не картинку вставлять, прям жипег. А просто в src напишу гет запрос нужный. Твой браузер, открывая страницу, соберет все теги img, у них соберет все src и запустит их в асинхронный загруз. В том числе и src, который дал я. Каждый такой загруз - это просто запрос по указанному URL с целью получить оттуда картинку в ответ. Если картинки нет, ой, src неправильный. Бразуер отобразит иконку битого изображения. Но запрос на твой сервер уже ушел. И уже вернул ответ. Он уже выполнился. А покуда ты там был залогинен, запрос прошел все проверки доступа.
Я помню, такой факап был, в свое время у вконтакта раннего. У них вся пользовательская админка была на гетзапросах. Причем, унифицированных для всех, без токенов безопасности и тд. Картинки счастья, сносящие учетки, меняющие личне данные, добавляющие тебя в друзья к хренпоймикому нет нет, да всплывали на сильно посещаемых форумах. А еще был "CSRF-вирус". Ссылка в "Мой сайт", по клике на которую открывался совершенно левый сайт, содержащий атаку на твой аккаунт, суть которой...прописывание ссылки на этот сайт в твой "мой сайт" в анкете. А ты и не замечаешь. В итоге ссыль на левый сайт обрастала нехилой такой массой внешней Золотое время...
Создал отдельный файл в корне сайта, и в него поместил HTML: <img src="http://localhost/dashboard/netology/sait/?interface-admin=1&del-id=5"> Открыл и удаление не сработало
Запросы на удаление и разлогинивание - только методом POST. Делается через создание формы - явное или не явное, и простой javascript, если надо, чтоб выглядело как ссылка.
Ну а как же быть, со статьями, там же такая же схема, например, пользователь хочет удалить статью, для интереса заходит в исходник и видит там ссылку del-question=2 и изменяет 2 на 50 и удаляется статья другого пользователя.