2010-10-17 5 views
9

От http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php я получил:Нужна помощь понимание MySQL инъекции

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

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

В первом примере, что они на самом деле видят?

Насколько я понял, если я на самом деле эхо $ name, вы увидите все имена, потому что он всегда будет «правдой», я прав?

Другая вещь, которую я не понимаю, заключается в том, решена ли проблема с MySQL-загрузкой с помощью mysql_real_escape_string(), там должно быть больше.

Что я действительно не понимаю, так это то, что mysql_real_escape_string() создан для решения этой проблемы, почему это не делается автоматически, я имею в виду, есть ли причина, по которой вам приходится добавлять каждый раз mysql_real_escape_string(), есть случаи когда вы должны использовать его, и поэтому они не делают это автоматически?

+1

Нет, mysql_real_escape_string() делается ** не ** для решения проблем, но для избежания кавычек. Очень важно это понимать. Но почти никто не понимает. –

+0

@Col. Шрапнель. Я вроде как ... подумал, что я понял это сейчас. Спасибо. – Trufa

+0

Я сомневаюсь. Представьте, что у вас есть запрос, который можно сортировать на основе пользовательского ввода, например 'SELECT FROM table ORDER BY field ', где поле вводится пользователем. Что вы будете делать? –

ответ

10

MySQL не выйдет автоматически, потому что вы сами создаете строку запроса.Например:

$query = 'SELECT * FROM users WHERE name="' . $name . '"'; 

Вы просто передаете необработанную строку, хранящуюся в $ query, который открыт для SQL-инъекции. Например, если $ имя [что-то «ИЛИ» 1 = 1] строка запроса заканчивается существо:

$query = 'SELECT * FROM users WHERE name="something" OR "1=1" 

Что бы вернуть каждый пользователь из таблицы пользователя. Вот почему вам нужно избегать значений. Однако, если вы используете PDO, это делается для вас, если вы используете функциональность привязки. Это двухэтапный процесс, подготовка запроса, а затем «привязка» данных/переменных к заполнителям. В PDO ваша строка запроса будет выглядеть примерно так:

$query = 'SELECT * FROM users WHERE name=":name"'; 
$bindings = array('name'=>'something'); 
prepare($query); 
execute($bindings); 

Затем все автоматически исчезает для вас.

+0

Я обязательно попробую! Я выгляжу очень интересно и очень просто спасибо +1 – Trufa

+0

Просто заметьте. PDO не избегают значений, если не в режиме совместимости –

+0

Да, но никто не использует 1 = 1, как это. Это используется только для обхода систем аутентификации. Этот пример не реален. – rook

5

Bobby Tables имеет большое представление о том, как работает SQL-инъекция. Много пользы - примеры, которые он дает на нескольких языках (C#, Java, Perl, PHP и т. Д.)

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

+0

Это выглядит хорошо! Я определенно хорошо прочитаю! Большое спасибо! – Trufa

1

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

Есть случаи, когда вы можете захотеть ввести код самостоятельно, например, если вы хотите создать пользовательский интерфейс, который может вводить код в вашу базу данных. (ala phpMyAdmin). возможно, было бы лучше, если бы он автоматически убежал от кода каким-то образом, а затем уклонился от него, если вы этого захотите. Может быть, что-то должно обсуждаться с создателями PHP/mySQL?

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

+0

Большое спасибо за отзыв. «... конечный пользователь - это грязная вонючая угроза, которая хочет сломать ваши вещи». - Я не могу перестать смеяться! интересное определение клиента BTW – Trufa

+0

@Trufa Я тоже не могу перестать смеяться «... конечный пользователь - грязная вонючая угроза, которая хочет сломать ваши вещи». является самым глупым объяснением необходимости побега. Вы должны избегать своих строк не потому, что эта причина, а потому, что неубежденные кавычки нарушают ваш запрос. И пользователи не имеют к этому никакого отношения. –

+0

это смешно! этот поток касается внедрения MySQL и возможности хакеров, желающих получить доступ к БД, а не обязательно законного ввода кода! Ты троллинг? из COURSE mysql_real_escape_string(); не был предназначен для этой причины. немного осветлите и сохраните это значение. – Partack

3

В первом примере на ссылке Tizag запрос выглядит так, как ожидается автор сценария для получения не более одной строки. Поэтому, учитывая, что каждая строка будет получена, наиболее вероятный результат, вероятно, будет отражен в информации для первой строки; поскольку в запросе подделанного запроса нет предложения ORDER BY, это может быть пользователь, хранящийся сначала в таблице, но, конечно, порядок не определен в SQL, когда отсутствует предложение ORDER BY, так что кто может сказать.Вы можете сказать, что до тех пор, пока таблица не будет пустой, она будет получать сведения о действительном пользователе.

Я не уверен, что вы подразумеваете под «if I echo $name»; переменной $name присваивается значение "timmy" в коде. Значит, они увидели бы timmy. Если вы имеете в виду, если бы вы попытались эхо получить информацию пользователя, полученную по запросу, что бы они увидели - ну, это зависит от кода, который вы используете. Если вы зацикливаетесь на наборе результатов, и они использовали SQL-инъекцию для извлечения строк, которые вы не ожидали от их получения, тогда они, вероятно, будут видеть все строки, включая строки, которые вы им не собирались видеть. Если ваш код просто извлекает и воздействует на информацию из одной строки, то они все равно будут видеть одну строку, хотя снова это может быть строка, которую вы не имели в виду, чтобы они могли достичь.

Что касается того, почему функциональность, предлагаемая mysql_real_escape_string(), не является автоматической, то это потому, что для ее автоматического использования на компьютере, который сможет работать с вашим кодом SQL, что вы намеревались делать, а не просто делать то, что вы сказал, чтобы сделать. Это и сложно, и откровенно нежелательно, потому что никто не хочет, чтобы компьютер угадал, что они хотят делать (особенно программисты).

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

+0

Большое вам спасибо за ответ, очень ясный и лаконичный. Но я понимаю, что при программировании на высоком уровне вы фактически позволяете компьютеру «решать» много вещей для вас, если вы начнете решать все, что вы закончите, для сборки сборки для html-страницы (просто шутите, но поняли?) – Trufa

+0

Для некоторых вещей это правда, а затем для других вещей это не так, и вы захотите сохранить большой контроль над деталями происходящего. Манипуляция строк, отправленных в базу данных, неизбежно должна быть одной из этих вещей. Например, рассмотрите эти две команды: 'UPDATE Message SET MessageText = '\'; - 'WHERE ID = 12345; 'и' UPDATE Message SET MessageText =' '; - 'WHERE ID = 12345; '. Эти две команды имеют очень разные эффекты. Если вы попытаетесь представить один из них, вы действительно хотите, чтобы PHP решил, что вы имели в виду другого? – Hammerite

+0

DAMN, это был умный ответ! – Trufa

1

Вы в верном правиле, человек, который ввел «плохое» имя, разрешил изменять запрос базы данных, который вы выполняете, и в этом случае они изменили его, чтобы показать все строки в Таблица.

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

Что касается того, почему это не делается автоматически? Сервер базы данных не может знать, какие данные можно доверять и какие данные не могут. Только программист знает, что, если им повезло! И вы не можете просто делать это по всем данным, потому что эти специальные символы (например, одна цитата) существуют по какой-то причине - они передают смысл серверу базы данных - если вы избегаете всех из них, тогда нет способа передать их значение. Это действительно фундаментальная концепция в информатике - чтобы одна и та же информация могла интерпретироваться на разных уровнях системы, и система могла использовать специальные шаблоны данных в этой информации, чтобы обозначать, когда данные должны интерпретироваться на другом уровне.

Возможно, вам будет полезно ознакомиться с концепцией слоев абстракции для более фундаментального понимания.

Удачи вам!

+0

Ваши объяснения ужасные. Нет такой вещи, как «доверенные» или «ненадежные» данные, lol. Только цитированные строки. Период. И экранирование работает только с цитированными строками. И никогда не поможет ни в чем другом, доверенном или неподготовленном. –

3

При обсуждении SQL-инъекции наиболее распространенным примером является «foo» ИЛИ 1 = 1 »удаление всей таблицы или выявление паролей. Эти инъекции могут быть сорваны, избегая строк.

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

$row_to_delete = $_POST['id']; 
$query = "DELETE FROM table WHERE id=$row_to_delete"; 

Как вы можете видеть, пользователь может легко размещать любой «идентификатор» они хотят этот сценарий, потенциально удалить всю таблицу, даже если mysql_real_escape_string() выполняется в строке. Эту же уязвимость можно использовать до guess, который «id» принадлежит администратору и вмешивается со значениями повсюду. Насколько я знаю, единственной защитой является проверка всех параметров get и post со всех возможных уголков, о которых вы можете думать. В принципе, не просто выполните проверку формы - выполните проверку PARAMETER.

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

+0

Абсолютно! У меня нет программистов что-то, что стоит взломать, но весь мой проект можно удалить, удалив или взломан 5-летним ради бога! – Trufa

0

mysql_real_escape_string() функция используется главным образом экранировать кавычки, что приводит к базе данных error.You не может зависеть от этой функции, потому что санация я очень важно, особенно при вводе пользователем непосредственно query.You может передать этот сайт https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

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