Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от SQL иньекций
 
 автор: nikolayers   (23.02.2010 в 21:57)   письмо автору
 
 

Как защититься от SQL иньекций???

  Ответить  
 
 автор: neadekvat   (23.02.2010 в 22:04)   письмо автору
 
   для: nikolayers   (23.02.2010 в 21:57)
 

http://www.phpfaq.ru/slashes

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 03:11)   письмо автору
 
   для: nikolayers   (23.02.2010 в 21:57)
 

Самой надежной защитой будет, то что вы понимаете что такое sql-запрос. Фильтруйте данные приходящие от пользователя(GET,POST,COOCKIE) И не позволяйте пользователю загрыть ваши кавычки и провести следующий запрос. И обязательно прочитайте статью что вам предоставил предыдущий комментатор, не факт что вы там все поймете, но постарайтесь

  Ответить  
 
 автор: Commander   (24.02.2010 в 06:39)   письмо автору
 
   для: nikolayers   (23.02.2010 в 21:57)
 

Все, что проходит через $_GET, $_POST, $_COOKIE необходимо фильтровать:
<?php
    
if (!get_magic_quotes_gpc()){
        
$username mysql_escape_strng($_POST['username']);//Строковый параметр
        
$password mysql_escape_string($_POST['password']);//Снова строка
        
$id_catalog intval($_POST['id_catalog']);//Числовой параметр
    
}
    else{
        
//Включен режим магических кавычек, следовательно, фильтрация не требуется
        
$username $_POST['username'];
        
$password $_POST['password'];
        
$id_catalog $_POST['id_catalog'];
    }
?>
Тоже самое с данными, находящимися в $_GET и $_COOKIE

  Ответить  
 
 автор: Trianon   (24.02.2010 в 09:33)   письмо автору
 
   для: Commander   (24.02.2010 в 06:39)
 

> //Включен режим магических кавычек, следовательно, фильтрация не требуется

А потом люди начитаются такого, и начинают в эту чушь верить.
Посмотрели бы чтоли задачу на инъекцию в разделе "задачи"

  Ответить  
 
 автор: DEM   (24.02.2010 в 10:32)   письмо автору
 
   для: Commander   (24.02.2010 в 06:39)
 

intval(); поставьте за if (!get_magic_quotes_gpc()){. Он к "магическим" кавычкам отношения не имеет

  Ответить  
 
 автор: Trianon   (24.02.2010 в 10:38)   письмо автору
 
   для: DEM   (24.02.2010 в 10:32)
 

>intval(); поставьте за if (!get_magic_quotes_gpc()){.

Это как?

  Ответить  
 
 автор: DEM   (24.02.2010 в 10:57)   письмо автору
 
   для: Trianon   (24.02.2010 в 10:38)
 


<?php 
    $id_catalog 
intval($_POST['id_catalog']);//Числовой параметр 
    
if (!get_magic_quotes_gpc()){ 
        
$username mysql_escape_strng($_POST['username']);//Строковый параметр 
        
$password mysql_escape_string($_POST['password']);//Снова строка     
    

    else{ 
        
//Включен режим магических кавычек, следовательно, фильтрация не требуется 
        
$username $_POST['username']; 
        
$password $_POST['password']; 
    } 
?>

  Ответить  
 
 автор: Trianon   (24.02.2010 в 11:18)   письмо автору
 
   для: DEM   (24.02.2010 в 10:57)
 

Это непринципиальный момент.

  Ответить  
 
 автор: oliss   (24.02.2010 в 11:31)   письмо автору
 
   для: DEM   (24.02.2010 в 10:57)
 

Привет хакерам :))00
   //Включен режим магических кавычек, следовательно, фильтрация не требуется 
        $username = $_POST['username']; 
        $password = $_POST['password'];  

  Ответить  
 
 автор: oliss   (24.02.2010 в 11:50)   письмо автору
 
   для: oliss   (24.02.2010 в 11:31)
 

есть два варианта:
1
.htaccess
# отключение магических кавычек 
php_flag magic_quotes_gpc Off 

2
<?
function s_slash($value)
{
    if( 
is_array($value) ){$value array_map('s_slash'$value);}
    elseif ( !empty(
$value) && is_string($value) ){ $value stripslashes($value); }
    return 
trim($value);
}
if (
get_magic_quotes_gpc())
    {
        
$_GET     =!empty($_GET) ? s_slash($_GET) : NULL;
        
$_POST    =!empty($_POST) ? s_slash($_POST) : NULL;
        
$_COOKIE =!empty($_COOKIE) ? s_slash($_COOKIE): NULL;
        
$_REQUEST =!empty($_REQUEST) ? s_slash($_REQUEST) : NULL;
    }   

Работа БД с переменным:
$username = mysql_escape_strng($_POST['username']);//Строковый параметр
$id = intval($_POST['id']); //числовой

  Ответить  
 
 автор: Trianon   (24.02.2010 в 12:32)   письмо автору
 
   для: oliss   (24.02.2010 в 11:50)
 

>Работа БД с переменным:

слегка поправлю

<?

$s_username 
"'".mysql_escape_strng($username)."'"// Строковый параметр SQL-запроса

$id = ((int)$id]); // целочисленный параметр SQL-запроса


(int) вместо intval() - непринципиально ( не смотря на то, что скорости у них отличаются на 2 порядка. )
А остальные моменты - таки да.

  Ответить  
 
 автор: Николай2357   (24.02.2010 в 12:35)   письмо автору
 
   для: Trianon   (24.02.2010 в 12:32)
 

Как я недавно попался на такую запись... Поставил апострофы еще и в запросе.
Все таки мне кажется их по месту лучше.

  Ответить  
 
 автор: Trianon   (24.02.2010 в 12:39)   письмо автору
 
   для: Николай2357   (24.02.2010 в 12:35)
 

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

Заметьте, при использовании плейсхолдеров никаких апострофов нет.

Я к тому, что рисуя что-то вроде " .... '$param' ..." , Вы автоматически подвергаете скрипт риску SQL-инъекции - достаточно изменить $param строкой выше.
В моем варианте такое произойти не сможет, хоть тресни.

  Ответить  
 
 автор: Николай2357   (24.02.2010 в 18:39)   письмо автору
 
   для: Trianon   (24.02.2010 в 12:39)
 

>Я к тому, что рисуя что-то вроде " .... '$param' ..." ,

Я не это имел ввиду, а это:
<?
"...... = '"s_slash($value) ."'......."

Дело вкуса конечно, мне почему то уютнее, когда по месту видно, что происходит с данными.
Вот я и влепил по привычке.

  Ответить  
 
 автор: Trianon   (25.02.2010 в 11:41)   письмо автору
 
   для: Николай2357   (24.02.2010 в 18:39)
 

Я не это имел ввиду, а это:
<?
"...... = '". s_slash($value) ."'......."

s_slash - синоним mysql_real_escape_string() ?
Если нет - дыра налицо.
Если да - она возникнет, когда определение этой функции изменят.

  Ответить  
 
 автор: Николай2357   (25.02.2010 в 12:59)   письмо автору
 
   для: Trianon   (25.02.2010 в 11:41)
 

>Если да - она возникнет, когда определение этой функции изменят.
Дело не в этом, синоним или нет. Я использую обертку, кто то нет - не суть.

Дело в чем там было - обнаружилась дырка в одном скрипте, меня попросили посмотреть. Функция была довольно внушительна и вот такое
<?
$value 
"'"mysql_real_escape_string($value)  ."'";
стояло в начале. А запрос в конце.
А автор при обработке тупо пропустил одну переменную.
Я и не заметил этих строк в начале функции. А так как точно знал, что данные в одно из полей попадают неэранированными, залепил в запросе всем строковым полям по привычке тоже самое. Подумав что обработки нет вовсе. В результате то поле, которое было дырявым, стало работать нормально. А остальные нет, так как там оказались экранированные бэкслэши.
И самое обидное, что это не синтаксическая ошибка - её хватились спустя некоторое время.

По этому я и сказал, что уютнее это делать в самом запросе, а не отдельно.

  Ответить  
 
 автор: TrianoN   (25.02.2010 в 13:30)   письмо автору
 
   для: Николай2357   (25.02.2010 в 12:59)
 

Так я и говорю "залепил по привычке" - камень преткновения.

Кроме того, я с некоторых про отвергаю сам термин "экранированные данные" .
Данные, в моем представлении могут быть либо сырыми, либо оформленными в виде литеральной строки. То, что во втором случае придется заняться экранированием - вторично.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 20:00)   письмо автору
 
   для: Trianon   (24.02.2010 в 12:39)
 

А меня вот один вопрос интересует:
Когда мы используем mysql_escape_strng нам приходиться в дальнейшем при извлечения из базы избавляться от ненужных слешей.
Можно вроде сделать вот так:

<?
$text 
strreplace("'","&#039;",$_POST['text']); // то есть заменяем апостроф на спец символ
// а дальше уже нормально генерим запрос
$sql "INSERT INTO table (text) values ('$text')"// то есть нам не удасться провести второй запрос.
mysql_query($sql,$db); 



Я это еще не проверял просто сейчас в голову пришло. Как думаете так можно?
Вроде и лишних слешей нет и выводиться в браузер будет текст как надо.

  Ответить  
 
 автор: Николай2357   (24.02.2010 в 21:22)   письмо автору
 
   для: tvv123456   (24.02.2010 в 20:00)
 

>нам приходиться в дальнейшем при извлечения из базы избавляться от ненужных слешей.

не приходится. В том весь и фокус))) Слэши нужны только для транспортировки, в базе их нет.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 21:45)   письмо автору
 
   для: Николай2357   (24.02.2010 в 21:22)
 

как так?
У меня они оказываються в базе
Можете рассказать, как у вас так здорово получаеться(это не сарказм)

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 22:24)   письмо автору
 
   для: tvv123456   (24.02.2010 в 21:45)
 

Модератор зря наверное удалил 2 последних коммента? Там был совет читать мануал и в ответе я спросил что именно читать. Думаю не справедливо были удалены эти 2 коммента

  Ответить  
 
 автор: Тень&   (24.02.2010 в 22:45)   письмо автору
 
   для: tvv123456   (24.02.2010 в 22:24)
 

[поправлено модератором]

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 22:53)   письмо автору
 
   для: Тень&   (24.02.2010 в 22:45)
 

Слушайте можно по-русски? Я с английским не очень в ладах. По поводу моей идее есть возражения?


Вот ребята еще темка http://www.softtime.org/forum/read.php?id_forum=3&id_theme=1489 тему эту я не начинал(хоть от моего лица), но тема эта очень интересная и чем больше народу ее глянет тем лучше..Просьба модераторов не удалять те комменты которые в последнем оказаться полезным

  Ответить  
 
 автор: Trianon   (24.02.2010 в 23:00)   письмо автору
 
   для: tvv123456   (24.02.2010 в 22:53)
 

>Слушайте можно по-русски? Я с английским не очень в ладах. По поводу моей идее есть возражения?

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

Подскажу. Если в БД у Вас попал слэш - значит сервер его расценил, как живой - следовательно он сам по себе был заэкранирован другим слэшем.
Нетрудно догадаться, почему.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 23:16)   письмо автору
 
   для: Trianon   (24.02.2010 в 23:00)
 

Как я понял: сервер сам должен разбирать где слеш экранирующий а где нет? Но у меня и на денвере и на хостинге слеши попадают в базу.
А идея про спец символы как?

  Ответить  
 
 автор: Тень&   (24.02.2010 в 23:02)   письмо автору
 
   для: tvv123456   (24.02.2010 в 22:53)
 

> По поводу моей идее есть возражения?

Да, "идея" в корне неверная, нет понимания механизма экранирования.

Это я так счётчик количество постов увеличиваю.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 23:12)   письмо автору
 
   для: Тень&   (24.02.2010 в 23:02)
 

>> По поводу моей идее есть возражения?
>
>Да, "идея" в корне неверная, нет понимания механизма экранирования.

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

  Ответить  
 
 автор: Тень&   (24.02.2010 в 23:15)   письмо автору
 
   для: tvv123456   (24.02.2010 в 23:12)
 

Безопасность тут вообще никаким боком.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 23:17)   письмо автору
 
   для: Тень&   (24.02.2010 в 23:15)
 

>Безопасность тут вообще никаким боком.
как так? если я смогу символом ' закрыть предыдущий запрос и начать новый то как не причем, а вот с &#039; это не пройдет?

  Ответить  
 
 автор: Тень&   (24.02.2010 в 23:19)   письмо автору
 
   для: tvv123456   (24.02.2010 в 23:17)
 

Это просто неправильная обработка данных, вот и всё.

  Ответить  
 
 автор: Trianon   (24.02.2010 в 23:25)   письмо автору
 
   для: tvv123456   (24.02.2010 в 23:17)
 

Еще раз.
Это нерпавильно.

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

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 23:29)   письмо автору
 
   для: Trianon   (24.02.2010 в 23:25)
 

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

Ладно я не спорю: мысль изреченная есть ложь
Но можете все таки мне(неофиту) обьяснить где в моей методике есть дыра(именно дыра, а не то что там не соответсвие общепринятым правилам)

  Ответить  
 
 автор: Тень&   (24.02.2010 в 23:36)   письмо автору
 
   для: tvv123456   (24.02.2010 в 23:29)
 

А даже если бы и не было дыры, то что? Допустим на секунду, что можно обрушить запрос (хоть явной уязвимости тут не наблюдается), если подставить в конец бекслеш. Ну и что? Ты тут же найдёшь HTML-представление бекслеша -- и вуаля. Опять вроде бы всё работает. Ты так и будешь переводить все "опасные" (о боже) символы в их HTML-представления. То есть вместо SQL-экранирования ты подставляешь просто HTML-экранированную строку. Задумайся как тебе "повезло": HTML-представление вида &#123; не содержит ни одного "опасного" (о боже) символа.

Так и поступай. Вперед. Все учатся на ошибках.

  Ответить  
 
 автор: tvv123456   (24.02.2010 в 23:40)   письмо автору
 
   для: Тень&   (24.02.2010 в 23:36)
 

Вы тут уже говорите об XSS? действительно сложно понять
Ну как я понял заэкранируете вы весь запрос и попытаетесь там вставить свой и пото мзакрыть апостроф но ведь с этого(о боже ) будет ошибочка.

  Ответить  
 
 автор: Trianon   (24.02.2010 в 23:48)   письмо автору
 
   для: tvv123456   (24.02.2010 в 23:29)
 

Где дыра, можно понаблюдать, решая задачу 21, придуманную специально для этого.

  Ответить  
 
 автор: пупсик   (25.02.2010 в 00:23)   письмо автору
 
   для: Trianon   (24.02.2010 в 23:48)
 

реально ребята а какая здесь уязвимость
смотрела 21 задачу

но все-таки у tvv123456 вроде свежий взгляд на решение проблемы

  Ответить  
 
 автор: tvv123456   (25.02.2010 в 00:25)   письмо автору
 
   для: Trianon   (24.02.2010 в 23:48)
 

там что-то с амерсандом было
а вчем зедсь проблема?
Ну правда
Я вообще ничего не шарю в php обьясните пожалуйста

  Ответить  
 
 автор: Николай2357   (25.02.2010 в 07:46)   письмо автору
 
   для: tvv123456   (25.02.2010 в 00:25)
 

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

  Ответить  
 
 автор: Тень&   (25.02.2010 в 18:47)   письмо автору
 
   для: tvv123456   (25.02.2010 в 00:25)
 

А вот, кстати, пример уязвимости, придумал:

<?php

$a 
"  \\";
$b ", b = (SELECT password FROM users WHERE user_id = 1) WHERE id = 2/*";

$sql "UPDATE table SET a = '{$a}', b = '{$b}' WHERE id = 1";

echo 
$sql;

?>

UPDATE table SET a = ' \', b = ', b = (SELECT password FROM users WHERE user_id = 1) WHERE id = 2/*' WHERE id = 1


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

Но это чисто ради интереса, опять же. Уязвимости -- лишь побочный эффект от неправильной обработки данных, притом не единственный.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования