Ошибка соединения MySQL / PHP, возможное изготовление пользователя - PullRequest
3 голосов
/ 28 апреля 2009

Я отвечаю за поддержание системы управления обучением, и это проблема, с которой я сталкивался в течение последних нескольких месяцев.

Один студент (среди тысяч) утверждает, что его материалы в эссе "съедены" сайтом. После отправки формы он говорит, что его эссе было заменено следующим текстом:

Предупреждение: mysql_connect () [function.mysql-connect]: потерян подключение к серверу MySQL при чтении начальный пакет связи ', система ошибка: 111 в /home/web/solomon_1.3/classes/db.class.php по линии 84

Неустранимая ошибка: ошибка подключения к сервер базы данных: в /home/web/solomon_1.3/classes/db.class.php по линии 85

Предыдущее предупреждение и фатальная ошибка сохраняются в базе данных как его отправка. Но как это может быть, поскольку ошибка ясно указывает на невозможность установления соединения? Страница отправки эссе примерно такая же простая, как и получается: устанавливается одно соединение с БД, данные формы сохраняются в БД, пользователь перенаправляется обратно на страницу отправки.

Строки 84-86 db.class.php:

if (!($sql_id=mysql_connect($server, $user, $pwd,$new))){
    trigger_error("[Error connecting to database server]: {$sql_id}", E_USER_ERROR);
}

Обратите внимание, что в сообщении об ошибке учащемуся отсутствуют квадратные скобки вокруг строки описания фатальной ошибки, как показано в исходном файле PHP. Эти квадратные скобки были добавлены почти два месяца назад после первого сообщения об ошибке учащегося с подозрением, что он просто вставлял строку с ошибкой в ​​поле отправки, чтобы избежать работы. Я предполагаю, что это версия 21-го века "собака съела мою домашнюю работу".

Еще неделю назад студент все еще сообщает об исходной ошибке без скобок . Серверная команда grep подтвердила, что ошибка, которую ученик продолжает «получать», основана на строке, которой просто не существует.

Итак, самое разумное объяснение состоит в том, что студент с нами связывается. Эта ошибка соединения с БД произошла в прошлом, но не ранее, чем за последние три месяца.

Есть шанс, что студент может быть исключен из-за этого, поэтому я хотел быть абсолютно уверенным, что мои доказательства убедительны. Можете ли вы представить какие-либо альтернативные теории, вероятные или нет?

Ответы [ 9 ]

5 голосов
/ 28 апреля 2009

У учащегося может быть установка, по которой скобки по какой-то причине удаляются, или он может просто отправить c + p предыдущей ошибки, когда увидит новую. Или они могли бы печатать это. Никогда не доверяйте сообщаемым пользователем сообщениям об ошибках 8).

Полагаю, первое, что я бы сказал, это то, что вы не должны отправлять сообщения об ошибках пользователю. Они должны быть зарегистрированы. Выключите display_errors в php.ini и включите log_errors. Это одновременно проблема безопасности (теперь я знаю о файловой структуре вашего сервера и о том, что вы используете MySQL), и она позволит вам отслеживать, когда происходят ошибки.

У вас также должны быть журналы доступа к веб-серверу, да? Если вы знаете IP-адрес, с которого поступает студент, это должно сообщить вам время доступа и время поиска ошибок.

Кроме того, вы можете рассмотреть возможность ведения журнала в вашем приложении, особенно в связи с тем, какой пользователь вошел в систему. Если перед вашим trigger_error вы добавите текущего пользователя и среду в файл, вы сразу узнаете, действительно ли этот пользователь видит эти проблемы.

5 голосов
/ 28 апреля 2009

Разве вы не регистрируетесь, когда происходят подобные ошибки?
Похоже, он все это выдумывает ...

Как говорит Джефф в Разработка на основе исключений

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

4 голосов
/ 28 апреля 2009

Рассматривали ли вы, чтобы попросить его сделать представление перед вами? Представление не должно быть реальным эссе (хотя это лучше), но, возможно, он делает то, чего ваш сценарий не ожидает. Пользователи всегда могут найти ошибки, когда «в этом коде просто не может быть ошибки».

РЕДАКТИРОВАТЬ: Рассматривали ли вы дать ему CD-R / RW и попросить его записать свои файлы на диск, и вы отправите его ему?

4 голосов
/ 28 апреля 2009

Наличие сообщения, отличного от того, что в коде ... это довольно веское доказательство.

Не обязательно. Если я увидел ошибку в первый раз, послал по электронной почте информацию об этом профилю, а затем получил очень похожую ошибку во второй раз, я, вероятно, просто скопировал бы исходное письмо и вместе с ним исходную ошибку.

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

Меня мало удивит, если в его входе есть что-то, что заставляет MySQL задыхаться. В своей собственной работе я обнаружил некоторые запросы, которые могут привести к сбою сервера MySQL (и в примечаниях к выпуску MySQL их полно). При правильной конфигурации MySQl вы можете легко получить ситуацию, когда сервер падает, а затем (очень быстро) восстанавливается / восстанавливается после сбоя, что может объяснить сообщение об ошибке, хранящееся на сервере.

Вместо того, чтобы обвинять парня, пусть он отправит его по электронной почте. Это гарантирует профессору, что задание было сдано в установленный срок, и позволят профу проверить отправку задания через онлайн-систему обучения.

4 голосов
/ 28 апреля 2009

In dubio pro reo . Если учащийся может предоставить свои материалы вовремя (без использования веб-сайта), я бы не стал выдвигать обвинения.

Конечно, наличие хорошего журнала с веб-сервера с такими параметрами, как размер параметров публикации, размер параметров SQL и снимок экрана экрана учащегося на момент публикации, может изменить ситуацию.

2 голосов
/ 28 апреля 2009

Как tpdi правильно указал: невинный человек не будет пытаться доказать эту невиновность.

И да, вы должны регистрировать ошибки в файле, возможно, даже отправлять системному администратору копию серьезных ошибок. Но все, что тебе сейчас не помогает.

Первые мысли:
Хотя нет прямых доказательств того, что студент готовит цифровую собаку, чтобы съесть домашнее задание, я никогда не видел сообщения об ошибке, вставляемого в какую-либо таблицу вместо ожидаемого содержимого.

Если из-за реальной ошибки в скрипте сообщение об ошибке переходит в новую запись, ошибка на экране, скорее всего, будет совершенно другой. Поэтому, если мать учащегося утверждает, что видела эту ошибку, мне будет еще труднее в нее поверить.

Отсутствующие угловые скобки в сообщении об ошибке:
Я видел много неожиданных сбоев, даже в коде, который «не мог ошибаться» (tm). Тот факт, что скобки отсутствуют, как указывали другие, сам по себе не является доказательством.
Ошибка может быть скопирована и вставлена ​​из старого сообщения электронной почты или даже изменена с помощью специального обработчика ошибок (который у вас, по-видимому, отсутствует, но только для того, чтобы указать на возможность).

Но, если подлинная ошибка в сценарии приводит к тому, что сообщение об ошибке заканчивается во вновь вставленной записи базы данных, это сообщение об ошибке генерируется сценарием. Однако отсутствующие угловые скобки настоятельно указывают на то, что сообщение об ошибке возникло вне сценария.

Затем в самом скрипте строчки:

84: if (!($sql_id=mysql_connect($server, $user, $pwd,$new))){
85:     trigger_error("[Error connecting to database server]: {$sql_id}", E_USER_ERROR);
86: }

Насколько я вижу, если сценарию не удается установить действительное соединение (строка 84), он вызывает ошибку пользователя в строке 85.
И наоборот, если сработала ошибка пользователя (строка 85), сценарию не удалось получить действительный идентификатор ссылки MySQL.

Насколько мне известно, PHP-скрипт не может повлиять на любые данные на сервере без действительного идентификатора ссылки MySQL.

В дополнение к отсутствующему идентификатору ссылки MySQL в строках выше отсутствует код, касающийся данных. Таким образом, даже если бы существовало правильное соединение, эти строки не инициировали бы вставку новой записи.

Я считаю крайне маловероятным, граничащим с невозможным, что ошибка в процессе открытия соединения с сервером базы данных когда-либо приведет к вставке записи, не говоря уже о записи, содержащей прекрасно читаемое сообщение об ошибке в стиле PHP.

Мой вывод основывается на информации, которую вы разместили:
У студента есть копия сообщения об ошибке, которое отображалось в браузере после реальной ошибки, произошедшей где-то в прошлом. Теперь он отправляет копию сообщения об ошибке в сценарий. Скрипт хранит размещенную информацию в базе данных.

0 голосов
/ 29 апреля 2009

Будет ли техническое обслуживание происходить в это время? Может быть, он представляет отчеты поздно утром, тогда как все остальные спят.

0 голосов
/ 29 апреля 2009

Если вы добавите несколько строк комментариев в начало этого файла PHP, чтобы номер строки предполагаемой ошибки изменился, получит ли учащийся такое же сообщение об ошибке или новое сообщение об ошибке с новыми номерами строк?

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

0 голосов
/ 28 апреля 2009

Это выглядит в основном законно для меня.

Как еще мог студент:

  1. знать имя явно внутреннего файла .php (это похоже на библиотеку, а не файл, обслуживаемый напрямую HTTP)
  2. знать номера строк кода обработки mysql_connect
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...