2011-12-28 3 views
0

Я понятия не имею о безопасности PHP, но если я добавлю ' в input в свой метод POSTform.Уязвимость с ошибкой MySQL

Я получаю следующее сообщение:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /usr/local/www/login.php 

Это инъекция SQL? Если да, то как его могут злоупотреблять «хакеры»?

+0

Возможный дубликат [Лучший способ остановить SQL Injection в PHP] (http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) –

+0

Недостаточно информации ответить на этот вопрос, не догадываясь. Отсутствует [минимальный образец кода] (http://sscce.org/), который должен иметь каждый вопрос SO. – outis

ответ

4

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

Абсолютный скелетным «безопасный» бит кода будет:

еще
<?php 
... connect to db ... 
$stringval = mysql_real_escape_string($_GET['param']); 
$sql = "SELECT somefield FROM sometable WHERE otherfield='$stringval'"; 
$result = mysql_query($sql) or die(mysql_error()); 

лучше отказаться от использования функции MySQL и переключиться на PDO и параметризованных запросов. Они автоматически обрабатывают проблемы с впрыском.

Коренной причиной сообщения об ошибке является то, что ваш запрос вызвал синтаксическую ошибку. Когда запрос выходит из строя так же, mysql_query() возвращает логическое значение FALSE, а не дескриптор инструкции.

Поскольку у вас отсутствует какая-либо проверка ошибок, вы слепо взяли это логическое значение false и передали его функции выборки, которая по праву пожаловалась, что вы не предоставили дескриптор результата.

+0

Спасибо. Но я много читал об этой вещи, и кажется, что нет способа получить доступ к базе данных или что-то в этом роде. Я попытался ввести его несколькими способами и, похоже, это невозможно, поэтому мой вопрос заключается в том, «как его вводить», потому что я не узнал о безопасности от SQL-инъекции и не понял, как это работает , Спасибо 1 + 'd на данный момент.:) – Cyclone

+0

Проблемы с классическим впрыском, такие как [Bobby Tables] (http://xkcd.com/327/), невозможны в PHP/MySQL, поскольку драйвер не разрешает несколько запросов в одном вызове. Но атаки на инъекции могут использоваться STILL для того, чтобы делать такие вещи, как подорвать системы входа/разрешения. –

0

Вы должны избегать ввода любого пользователя перед передачей его в mysql. Используйте функцию PHP mysql_real_escape_string(), чтобы избежать ввода любого пользователя, прежде чем добавлять его в свой запрос. Вот ссылка на PHP инструкции для mysql_real_escape_string()

Update: Да, что другие говорят об использовании подготовленных заявлений или MySQLi гораздо лучше, используя расширение MySQL.

Вот несколько ссылок на MySQL инъекций, которые я нашел:

+0

На самом деле лучшим способом быть в безопасности от SQL-инъекции является использование подготовленного оператора. –

+0

Расширение mysql устарело и на пути к устареванию. Новый код должен использовать mysqli или PDO, оба из которых имеют важные преимущества, такие как поддержка подготовленных операторов, что является современным способом предотвращения инъекционных атак. – outis

+0

Я обновил свой ответ, чтобы предоставить некоторые ссылки на более подробные сведения о SQL Injection, подготовленных операциях и mysqli. – Virendra

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