2011-12-30 2 views
3

Можно создать дубликат:
Best way to stop SQL Injection in PHP

Если бы я должен был использовать функцию $ _GET, чтобы получить переменную из URL, как я могу сделать это взломать доказательство ? Прямо сейчас у меня просто есть addSlashes, что еще я должен добавить?

$variable1 = addslashes($_GET['variable1']); 
//www.xxxxx.com/GetTest.php?variable1=xxxx 
+0

На будущее это моя функция защиты числовой значения в функции get (удалить функцию floatval() для не числовых значений get): 'addslashes (mysql_real_escape_string (strip_tags (floatval())));' –

ответ

19

Первое и главное правило с ЛЮБОЙ ввод, а не только $ _GET, но даже с $ _POST, $ _FILES и все, что вы читаете с диска или из потока, вы всегда должны VALIDATE.

Теперь, чтобы ответить на ваш вопрос более подробно, у вас есть несколько HACKS, которые существуют в этом мире.Позвольте мне показать вам некоторые:

XSS инъекции

Если вы принимаете данные из URL, такие как от $ _GET и вывода этой информации без зачистки возможных тегов, вы могли бы сделать ваш сайт склонной к XSS инъекции или инъекции кода. Например:

http://myhoturl.com/?search=<script>window.location.href="http://thisisahack.com/"</script> 

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

SQL Injection

Можно вводить SQL для вашего приложения. Например:

http://myhoturl.com/?search=%'; UPDATE users SET password=MD5('hello'); SELECT * FROM users WHERE username LIKE '% 

бы сделать ваш SQL выглядеть следующим образом:

SELECT * FROM articles WHERE title LIKE '%%'; UPDATE users SET password=MD5('hello'); SELECT * FROM users WHERE username LIKE '%%'; 

И, таким образом, вы бы обновить все пароля вашего пользователя к Hello, а затем вернуть то, что не соответствует.

Это всего лишь краткий обзор того, что вы можете сделать с помощью SQL-инъекции. Чтобы защитить себя, используйте mysql_real_escape_string или PDO или любой хороший уровень абстракции DB.

инъекции Код

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

//File igotuploaded.txt 
<?php echo 'helloworld'; ?> 

И url позволяет вам ВКЛЮЧАТЬ файл по названию. ? Показать = myhotfile.txt

//In this file we include myhotfile.txt 
include($_GET['show']); 

Человек меняется, что показать = ../добавления/igotuploaded.txt и вы будете работать эхо 'Привет мир';

Это опасно.

правило ... не доверяйте USER ВХОДА, всегда проверять, предотвратить, проверить, исправить, утвердить и вновь правильно ...

Успехов

+0

Итак, как я могу это сделать, чтобы мой php-скрипт игнорировал SQL-запросы, которые извлекаются через $ _get? Спасибо за все примеры! –

+0

mysql_real_escape_string или если вы используете PDO или хороший уровень БД, он обычно делает это для вас ... –

+0

Что такое «PDO» Что это значит и как его использовать? Я видел это много! Еще раз спасибо за помощь! –

5

Это полностью зависит от того, что вы собираетесь делать с ним:

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

+0

Предположим, что я использовал его так, как указано ниже он (у меня сейчас нет конкретного использования, я просто пытаюсь это узнать, когда я решаю использовать get в будущем, я буду использовать его безопасно ... В любом случае, скажем: mysql_query ("SELECT userid FROM user WHERE password = '". $ _ GET ["variable1"]. "';"); –

+0

Пароли, которые вы, как правило, не читаете из GET-Variables. Вместо этого используйте поле пароля в форме POST (HTML). И пароли всегда должны быть md5() - защищены. (Для пароля вам понадобится только 'mysql_real_escape_string();' потому что вы его не распечатаете. – Dion

+0

Хорошо, отлично! Теперь о чем-то вроде просмотра страницы профиля пользователя, и это был не пароль, а просто номер ... как 54038.И я извлекал и отображал все записи в таблице, где номер этого пользователя находился в поле под названием «userID». Какой тип инъекций может быть вреден там и как я могу его предотвратить? –

-1

чтение $ _GET переменные сырыми не опасно,

опасность, как правило, находится в пределах SQL Инъекции,

, например:

$_GET["variable1"] = "' OR 1=1 --"; 

С запросом:

mysql_query("SELECT userid FROM user WHERE password='".$_GET["variable1"]."';"); 

Во избежание этого:

$safe_input = mysql_real_escape_string($GET["variable1"]); 
mysql_query("SELECT userid FROM user WHERE password='".$safe_input."';"); 
+1

-1. 'mysql_real_escape_string()' не _always_ предотвращает инъекции. Это может дать ОП идею, что если он просто избежит ввода, ему больше не придется беспокоиться о SQL-инъекциях. – kba

+0

mysql_real_escape_string - это хорошо! Кроме того, какие другие способы являются распространенными средствами профилактики Кристиана Антонсена? –

+1

@AlbertRenshaw 'mysql_real_escape_string()' только ускользает от тиков, кавычек и т.п. Предполагая, что их нет, это совсем не полезно. Примером может служить 'LIMIT 10, $ page' для разбивки на страницы. Если '$ page' содержит' 1; DROP TABLE tbl - ', ускорение не помогло бы. Всегда проверяйте свой ввод и убедитесь, что у вас есть правильное значение (например, 'is_numeric' и' intval'). – kba

3

Две самые большие риски, с которыми вы сталкиваетесь при использовании пользовательского ввода (любой запрос HTTP засчитывается как пользовательский ввод) являются:

Вы должны ознакомиться с рисками и защитой. Защита каждой из этих угроз различна. Использование addslashes() не является полной защитой.

Отличный ресурс для получения дополнительной информации о безопасном веб-программировании - это OWASP Top Ten project.

Я сделал презентацию о SQL Injection Myths and Fallacies, которая, я надеюсь, полезна для вас.

+0

Я заметил, что в комментарии другого пользователя они сказали, что «XSS-инъекция» означает, что это означает, что инъекция кросс-сайта? –

+0

Да, XSS - популярная аббревиатура для Cross Site Scripting. –

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