2014-01-14 4 views
0

Я тестирую свой сайт для проблем с SQL-инъекциями и сталкиваюсь с паролем, который я не могу понять.Ошибки тестирования SQL-инъекций

В основе, я создаю систему ведения блога пользователя.

Я использую SQL впрыснуть мне Firefox плагин и вот некоторые ошибки, которые я получил:

«Ошибка строки найдено:„Integrity нарушение ограничения“»

«Статус сервера Код: 302 Временно перемещено» - Я думаю, что это просто потому, что я перенаправляю пользователя на ошибку для определенной формы.

В целом у меня не было ошибок и прошло 42 000 тестов. Однако некоторые из моих элементов базы данных выполняются.

Допустит, я вторя из тех «сообщений» из базы данных:

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

Даже если пользователь не вошел в систему, SQL-инъекция может изменять сообщения.

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

Как это может быть? И отображает форму «display: none» достаточно хорошо?

+0

Что вы используете для связи: mysqli? – Ryan

+0

@ryan вся моя обработка формы выполняется с использованием связанных запросов и PDO. – Lovelock

+0

@jeroen - я думаю, это немного отличается, потому что он спрашивает о тестировании и о том, как результат был получен; а не инъекции или ее профилактики. – jww

ответ

0

Прежде чем вставлять данные в базу данных, необходимо проверить, вошел ли пользователь (имеет действительный сеанс); пример кода ниже:

В вашей странице входа в систему, если имя пользователя/пароль правильно, выполните следующее:

$_SESSION["logged_in"] = true; 

Это сделает PHP «помнить», что текущая сессия печенье является действительным, и принадлежит к действительным пользователь.

Всякий раз, когда вам необходимо изменить содержимое базы данных, вы можете проверить:

if (isset($_SESSION["logged_in"]) && $_SESSION["logged_in"]) { 
    // all good, user is logged in, you can change database contents 
    mysqli_query("UPDATE ..."); // example query 
} else { 
    // something is wrong, the form is submitted without a valid session 
    // so it's probably a malicious user, anyway don't change database contents 
    echo "Access denied, please log in."; // display error message 
    header("Location : /login.php"); // or redirect them to the login page 
}; 

И отображает форму «отображаемое: Нет» достаточно хорошо?

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

+0

Попытайтесь улучшить проверку пользователя перед вставкой данных. Также как я могу обойти форму? Я мог бы использовать js для создания формы, я думаю. – Lovelock

+0

Ваша форма прекрасна, пока вы проверяете сеанс пользователя перед тем, как вставлять какие-либо данные в БД, а использование Javascript в качестве «защиты» - плохая идея; злоумышленник может легко обойти это. –

+0

извините, я хотел показать форму. Если я создаю форму с помощью js вместо того, чтобы ее эхом и отображали как скрытую форму. – Lovelock

Смежные вопросы