Безопасность скрипта

phpon

Новичок
Есть вопрос :)
2 параметра скрипту передаются ссылкой:
http://www.site.ru/all.php?id1=1&id2=1
и потом подставляются в запрос:
$query = "SELECT * FROM table WHERE region_num = '$id1' AND (cat_num_1 = '$id2' OR cat_num_2 = '$id2' OR cat_num_3 = '$id2') ORDER BY counter;";
Все сыпется, если подставляю в урл:
http://www.site.ru/all.php?id1=1&id2='
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''')' at line 1
http://www.site.ru/all.php?id1=1&id2=\
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' OR cat_num_3 = '\')' at line 1
Как вырезать эти символы на входе??
Пробовал:
@$id2 = mysql_real_escape_string($id2);
---
@$id2 = htmlspecialchars(stripslashes(trim($id2)), ENT_QUOTES);
---
@$id2 = htmlspecialchars(stripslashes(trim($id2)));
---
@$id2 = htmlspecialchars(trim($id2), ENT_QUOTES);
---
@$id2 = htmlspecialchars(trim($id2));
---
$str = chr(39);
@$id2 = str_replace($str,"",$id2);
---
$id2 = intval($id2);
---
if (is_numeric($id2) == false) {
$id2 = 1;
}

Вообщем, как не изголялся, не получается вырезать одинарную кавычку и обратный слеш при вводе в url.
HELP :(
 

dimagolov

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

phpon

Новичок
Прочитал это:
http://phpfaq.ru/slashes
http://phpfaq.ru/globals
Много гуглил.
Если ты насчет $_GET['var'], то достаточно сделать так:
$id2 = $_GET['id2'];
К тому же пробовал все перечисленные варианты и с $_GET['id2'], то есть:
$_GET['id2'] = mysql_real_escape_string($_GET['id2']);
и так далее. По дате моей регистрации видно, что я тут больше читал, чем писал - сейчас туплю, ну дык ткни носом, раз ты гуру...
Спасибо.
 

dimagolov

Новичок
К тому же пробовал все перечисленные варианты и с $_GET['id2'], то есть:
$_GET['id2'] = mysql_real_escape_string($_GET['id2']);
именно так делать не нужно, как нужно написал ***** в этой теме.
но ты же врешь, так как если бы ты даже так делал, то ошибки синтаксиса mysql не давал бы ну никак.
 

phpon

Новичок
Какой смысл мне врать??? Я же за советом пришел. Делал так, как написал. С $_POST все в порядке (там хоть в форму, хоть в урл ввожу что угодно и никаких ошибок синтаксиса mysql не выдает - скрипт отрабатывает как надо - все, что нужно режется и прослешивается). А с $_GET запара :(

PS. "именно так делать не нужно, как нужно написал ***** в этой теме" - за звездами не видно в какой теме ты отписался.
Где посмотреть совет можно?
 

HraKK

Мудак
Команда форума
***** - это Фaнaт.
id - надо приводить е целочисленому виду
$id= (INT)$_GET['id'];

а строковые пропускать через
$string= mysql_real_escape_string($_GET['string']);

Есть вопросы?
 

phpon

Новичок
А этого разве не достаточно?
settype($_GET['$id'], 'integer');
или
$_GET['$id'] = intval($_GET['$id']);
И то, и другое пробовал со всеми вариантами. К челочисленным сразу привел - при вводе всяких " ! пробела и т.д. помогает $id2 == 0 и все ок. А вот одинарная кавычка и обратный слеш попадают в sql-запрос необработанными.

Уже и так попробовал - болт :(
$_GET['id2'] = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $_GET['id2']);
$id2 = $_GET['id2'];

-~{}~ 05.12.08 01:40:

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

Beavis

Banned
phpon
видишь как плохо, когда переменные названы чёрт знает как?
 

Zetruger

ivan.chistyakov.name
юзайте

mysql_queryf($format, $arg1, ....);

примерно так

mysql_queryf('DELETE FROM qwe WHERE id=%u', $_POST['id']);

или

mysql_queryf('SELECT * FROM qwe WHERE x=%u AND y="%s"', $_POST['id'], $_POST['name']);

функция сама проэскейпит все аргументы

:D
 

Zetruger

ivan.chistyakov.name
dimagolov
ааа )))
я ждал этого вопроса

видишь ли тут политака форума, что нельза давать готовые решения, програмеры должны думать и тренировать свой моск

я ее написал сам для себя
и теперь о иньекциях и проверке вообще не задумываюсь
все происходит на автомате и причем очень стильно и красиво))
 

Фанат

oncle terrible
Команда форума
а в таком случае что писать?
mysql_queryf('SELECT * FROM qwe ORDER BY ???',$_GET['sort']);
 

Zetruger

ivan.chistyakov.name
*****
ну тут два варианта
в мускуле можно питать так ORDER BY `qwe`

хотя имхо надо конечно стремиться не отступать от стандартов где это возможно

конечно тонких моментов много

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

Фанат

oncle terrible
Команда форума
ну что значит "предпочел бы"?
вот таблица выводится. сортируется по нескольким полям.
тут дело не в предпочтениях, а в ТЗ. банальнейшая задача.

это я, собственно, к тому, что
и теперь о иньекциях и проверке вообще не задумываюсь
а задумываться надо
 

Фанат

oncle terrible
Команда форума
А не должно быть.
Говоря о защите от инъекций, все имеют в виду банальный синтаксис данных.
а о самих реально инъекциях лидо не знают, либо не упоминают.
 

Stierus

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

Фанат

oncle terrible
Команда форума
ля.
а что тебе тогда до сих пор еще не ясно?

единственное место, где возможна инъекция при правильной работе с данными - это управляющие структуры.
соответственно, надо делать защиту.

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