где-то во время учебы я узнал что-то интересное .. Он говорит что-то вроде:
$query = sprintf("SELECT firstname, lastname, address, age FROM friends WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname), mysql_real_escape_string($lastname));
используя этот запрос, а не
$query="select firstname, lastname, address, age FROM friends WHERE firstname='".$_RETURN['name1']."', lastname='".$_RETURN['name2']."'";
это кажется разумным .. у вас пробовал эту кодировку когда-либо .. и как она помогает предотвратить любые вредоносные атаки ..
Во-первых, это называется SQL-Injection . В основном это просто возможность изменять запросы к базе данных с помощью ввода пользователем.
Давайте посмотрим на пример:
Запрос:
SELECT temp1 FROM temp WHERE temp2 = 'VAR1';
Теперь мы назначим VAR1 значение: '; DROP TABLE *; --
'; DROP TABLE *; --
'; DROP TABLE *; --
И мы получим:
SELECT temp1 FROM temp WHERE temp2 = ''; DROP TABLE *; --';
С mysql_real_escape_string
он будет выглядеть так:
SELECT temp1 FROM temp WHERE temp2 = '\'; DROP TABLE *; --'
mysql_real_escape_string
'защищает' строку для использования в запросе.
Но, в конце концов, вы должны полностью прекратить использование mysql_*
. Они устарели и считаются небезопасными, когда дело доходит до предотвращения внедрения SQL или других способов закалки с запросами.
Вы должны просто прекратить объединять запросы вместе так и начинать с использования подготовленных операторов , которые не только проще в использовании, но и предотвращают внедрение SQL по умолчанию, но также могут улучшить скорость вашего приложения.
Для PHP существуют два расширения, которые предназначены для закрытия всего mysql_*
:
И я говорю это снова: прекратите использование mysql_*
!
Насколько мне известно, mysql_real_escape_string
является одним из лучших способов предотвратить внедрение SQL , не mysql_real_escape_string
подготовленных операторов с mysqli или PDO .
Использование форматирующих функций, таких как sprintf
является чисто вопросом вкуса; большим преимуществом в первом примере является то, что функция mysql_real_escape_string
предотвращает все инъекции SQL (объясняется в одном из других ответов); в отличие от некоторой функции iffy magic_quotes_gpc
в PHP, на которую многие полагаются.
magic_quotes_gpc
автоматически избегает вещей, которые вы получаете в запросах от клиентов … но не может обнаружить так называемые инъекции второго уровня:
magic_quotes_gpc
предотвращает SQL-инъекцию; злонамеренная строка сохраняется правильно. magic_quotes_gpc
не magic_quotes_gpc
строку. Voilà, SQL-инъекция; ваши данные теперь, вероятно, исчезли. Используя некоторые способы ускользнуть от себя, либо что-то вроде mysql_real_escape_string
либо уровень абстракции базы данных с построителем запросов (например, Adodb), безусловно, превосходит просто надежду на лучшее.