[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: не знаю как проверить GET
BNik
у меня сайт- каталог статей, начало скрипта вот
$parent = $_GET['parent'];


if (isset($parent) && ($parent!=''))
$result = mysql_query("select * from turccke where parent=$parent order by tur_id");
else
$result = mysql_query('select * from turccke where parent is null order by tur_id);

собственно сайт ломали, и мне подсказали сделать проверку GET.А вот как и что именно проверять я не знаю. Подскажите пожалуйста.



Спустя 2 минуты, 15 секунд (15.12.2010 - 19:20) waldicom написал(а):
Если в $_GET['parent'] содержится число, что можно так:
$parent = (int) $_GET['parent'];

Спустя 10 секунд (15.12.2010 - 19:21) koala написал(а):
В переменную $parent можно запихнуть что угодно. Например можно выполнить SQL запрос. А что именно в переменной $parent должно быть?

Спустя 4 минуты, 51 секунда (15.12.2010 - 19:25) BNik написал(а):
parrent у меня в бд, это выборка статей по присвоенному родительскому номеру , к примеру первый раздел статей "Техника", в бд parrent = 10000, далее идут подразделы, которые выводятся по id

Спустя 6 минут, 43 секунды (15.12.2010 - 19:32) Invis1ble написал(а):
тогда как waldicom написал

Спустя 4 минуты, 20 секунд (15.12.2010 - 19:36) BNik написал(а):
waldicom
переменной парент присваивается значение парент из массива GET, я правильно читаю?)
не могли бы Вы пояснить, что такое инт?

Спустя 2 минуты, 22 секунды (15.12.2010 - 19:39) koala написал(а):
BNik, int целочисленное значение (1 2 20 25), тоисть без плавающей точки. Основы программирование - Типы данных.

Спустя 4 минуты, 5 секунд (15.12.2010 - 19:43) BNik написал(а):
koala
спасибо

Спустя 11 минут, 41 секунда (15.12.2010 - 19:55) koala написал(а):
Цитата
koala
спасибо



Посмотрите на мою подпись.... user posted image

Спустя 25 секунд (15.12.2010 - 19:55) Invis1ble написал(а):
BNik
(int) приводит значение к целочисленному типу - это гарантирует, что в запрос к БД тебе не попадут строки, что убережет от SQL-инъекции. Например, если тебе введут вместо числа id какой-нибудь мерзопакосный запрос - int превратит этот запрос в число 0

Спустя 6 минут, 56 секунд (15.12.2010 - 20:02) BNik написал(а):
koala
посты <10)))
Invis1ble
И Вам спасибо)

Спустя 3 минуты, 9 секунд (15.12.2010 - 20:05) Vall написал(а):
Это
$parent = (int) $_GET['parent'];
не проверка, а изменение типа и, возможно, значения.
И значит скрипт может получить не то, что передано и не то, что ожидается,
т. е число, которое ни к селу ни к городу.

Спустя 3 минуты, 39 секунд (15.12.2010 - 20:09) koala написал(а):
Vall, представь ты изменяешь числу 2 тип на int. Что получится? ))

Спустя 6 минут, 2 секунды (15.12.2010 - 20:15) Vall написал(а):
Если 2 было вещественным или строкой то станет целым,
если было целым, то и останется целым.
Но суть темы не в этом.

Спустя 1 минута, 46 секунд (15.12.2010 - 20:17) koala написал(а):
Цитата
Если 2 было вещественным или строкой то станет целым,
если было целым, то и останется целым.



Vall, в скрипт передают числовые данные, в переменную парент. Здесь строки не передаются =)

Спустя 21 минута, 11 секунд (15.12.2010 - 20:38) Vall написал(а):
Вообще-то, всё, что передаётся из формы - это текст, не числа.
Предположим, мне нужна статья под номером 25, в адресной строке браузера набираю site.ru/part=25, но по ошибке вставил точку (part=2.5).
И получу статью номер 2 (или 3, в зависимости от преобразования).
Спрашивается зачем показывать не нужное, гонять скрипт, трафик и сервер баз?
Не проще остановить скрипт и впечатать "Извини, дорогой"?
Или все таки надо заставить посмотреть не нужную мне статью под номером 2 ?

Спустя 6 минут, 20 секунд (15.12.2010 - 20:44) kovaldm написал(а):
Проверяй функцией is_int. Если не пройдет, то пиши "Извини, дорогой!".

Спустя 3 минуты, 9 секунд (15.12.2010 - 20:47) Invis1ble написал(а):
Vall
Имхо, айдишники должны быть включены в ссылки (причем без ошибок =)), а если ты такой (я не про тебя) умный и набираешь через адресную строку, то это твои проблемы, если ты ошибешься

Спустя 3 минуты, 41 секунда (15.12.2010 - 20:51) kovaldm написал(а):
Invis1ble
Тогда нужно выводить 404 или дефолтную страницу. Это если вручную УРЛ вводить.

Спустя 3 минуты, 52 секунды (15.12.2010 - 20:55) BNik написал(а):
а как тогда проверить POST если переменная не число?

   $text=$_POST['name'];  



Спустя 1 минута, 38 секунд (15.12.2010 - 20:56) koala написал(а):
BNik, от XSS htmlspecialchars()

Спустя 17 секунд (15.12.2010 - 20:57) kovaldm написал(а):
is_string. А вобще вот почитай.

Спустя 40 секунд (15.12.2010 - 20:57) kovaldm написал(а):
koala
Дык он ,вроде, не защититься хочет, а проверить.

Спустя 2 минуты, 54 секунды (15.12.2010 - 21:00) BNik написал(а):
kovaldm
в том то и дело что мне надо защититься

Спустя 1 минута, 44 секунды (15.12.2010 - 21:02) Vall написал(а):
При чем тут мои ошибки, руками не руками, хакеры не хакеры?

Я привел первый попавшийся пример.

Надо проверять входные данные, и если они соответствую, то пропускать.
Если не соответствуют, то НЕ МЕНЯТЬ их на никому не нужное, а предусмотреть логику работы скрипта на этот случай.

Вот с этим я полностью согласен
Цитата (kovaldm @ 15.12.2010 - 17:44)
Проверяй функцией is_int. Если не пройдет, то пиши "Извини, дорогой!".

Спустя 3 минуты, 23 секунды (15.12.2010 - 21:05) Invis1ble написал(а):
Vall
Не кипятись, я не конкретно про тебя говорил ))
а вообще
Цитата
Надо проверять входные данные, и если они соответствую, то пропускать.
Если не соответствуют, то НЕ МЕНЯТЬ их на никому не нужное, а предусмотреть логику работы скрипта на этот случай.

это правда

Спустя 44 минуты, 19 секунд (15.12.2010 - 21:50) kovaldm написал(а):
Цитата
предусмотреть логику работы скрипта на этот случай.

Если данные вводятся через форму, то возвращай форму с предупреждением, если переход осуществляется по ссылке, то выводи 404 ошибку.

Спустя 5 часов, 15 минут, 41 секунда (16.12.2010 - 03:05) ИНСИ написал(а):
Vall в общем:

1. Если ты знаешь, что переменная содержит число то:
(int) либо intval()

2. Если в переменной текст то:
mysql_real_escape_string() и stripslashes()


Читай информацию о функциях

Спустя 10 часов, 57 секунд (16.12.2010 - 13:06) hellmin написал(а):
Если подставлять дефолтное значение, то можно так

$result = mysql_query("select * from turccke where parent=".(is_numeric($_GET['parent']) ? $_GET['parent'] : 0)." order by tur_id");

Спустя 28 минут, 25 секунд (16.12.2010 - 13:35) Vall написал(а):
welbox2, спасибо за советы. Правда не понятно почему мне, если помощь просил BNik.

Выше я утверждал, что полученное из формы надо именно проверять, тем более, что в теме прозвучал вопрос "не знаю как проверить GET", а не изменять, как предлагалось некоторыми оппонетами.
А что вы предлагаете? Менять или проверять? Из ваших советов не понятно.

Да, и маленькое несогласие.
Что приходит от клиента заранее никогда невозможно знать.
В информации о функции mysql_real_escape_string() я прочитал, что её надо использовать при передаче значений в базу, а не при получении GET-значений. А про функцию stripslashes написано, что её надо использовать после применения addslashes() или магических кавычек.
И получается, как бы, к проверке входных данных эти функции отношения не имеют.

Надеюсь, что наш обмен мнениями будет полезен для BNik.

Спустя 39 минут, 58 секунд (16.12.2010 - 14:15) ИНСИ написал(а):
Vall ссори smile.gif

Я дал советы, на вот это:
Цитата
собственно сайт ломали, и мне подсказали сделать проверку GET.А вот как и что именно проверять я не знаю. Подскажите пожалуйста.


Спустя 1 час, 46 минут, 54 секунды (16.12.2010 - 16:02) inpost написал(а):
Vall
Это не поиск, и по логике скрипта, это не вводит пользователь! Как говорили эксперты, пришедшие люди порой сами не знают, что хотят, поэтому надо догадываться или помогать теми силами, которые знаешь.
Если полностью перефразировать ТС, то звучит: "Вот код, что тут не так:", а тут не так только одно, не хватает (int), как было сказано ранее, и не стоит забивать голову всяким бредом.

Совсем не дурно тема безопасности рассмотрена в нужной теме: http://phpforum.ru/index.php?showtopic=21213

ТС, тебе туда =)

Если что-то конкретное будет не понятно, тогда уже спрашивай.

Спустя 5 часов, 10 минут, 33 секунды (16.12.2010 - 21:12) Reydan написал(а):
Цитата (BNik @ 15.12.2010 - 16:18)
у меня сайт- каталог статей, начало скрипта вот
$parent = $_GET['parent'];


if (isset($parent) && ($parent!=''))
$result = mysql_query("select * from turccke where parent=$parent order by tur_id");
else
$result = mysql_query('select * from turccke where parent is null order by tur_id);

собственно сайт ломали, и мне подсказали сделать проверку GET.А вот как и что именно проверять я не знаю. Подскажите пожалуйста.

а нельзя реализовать это так?
$parent = $_GET['parent'];


if (isset($parent) && (is_numeric($parent)){
$result = mysql_query("select * from turccke where parent=$parent order by tur_id");
} else {
$result = mysql_query('select * from turccke where parent is null order by tur_id);
}



Функция is_numeric(); Проверяет является ли строка числом типом или числовой строкой;
Конечно приведение к целочисленному типу решает многие вопросы, но если ему нужна проверка - вот проверка -)

Спустя 6 часов, 27 минут, 44 секунды (17.12.2010 - 03:40) Vall написал(а):
Цитата (inpost @ 16.12.2010 - 13:02)
Vall
Это не поиск, и по логике скрипта, это не вводит пользователь!
Пользователь не вводит или вводит то, что хочет или разумеет, и пользуется не только браузером, но и другими программами в которых предусмотрен только ручной ввод, по-этому скрипт надо защищать правильно не смотря на то, что "Это не поиск".
Цитата (inpost @ 16.12.2010 - 13:02)
... тут не так только одно, не хватает (int)
По поводу неправильности применения (int), кажется, выяснили выше. Если сомневаетесь, то попробуйте спросить у автора предлагаемой вами статьии. С его авторитетом и мастерством объяснить вам не составит труда.
Цитата (inpost @ 16.12.2010 - 13:02)
... не стоит забивать голову всяким бредом.
А вот с этим с вами полностью согласен. Не стоит забивать.
Цитата (inpost @ 16.12.2010 - 13:02)
Если что-то конкретное будет не понятно, тогда уже спрашивай.
Спасибо! Если что-то конкретное будет не понятно, тогда спрошу обязательно.

Спустя 5 часов, 35 минут, 28 секунд (17.12.2010 - 09:15) hellmin написал(а):
А можно проверять (чтобы не было sql-инъекций) таким образом.
// Функция экранирования переменных
function quote_smart($value)
{
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем

if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}

// Использовать вот так
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));

Спустя 4 часа, 40 минут, 23 секунды (17.12.2010 - 13:56) ИНСИ написал(а):
Цитата
А можно проверять (чтобы не было sql-инъекций) таким образом.

а что если ты передашь в функцию массив? надо бы добавить проверку на массив и обход через array_map

Спустя 16 минут, 35 секунд (17.12.2010 - 14:12) hellmin написал(а):
А зачем я буду передавать массив? Как массив вставить в sql-запрос?

Спустя 9 дней, 21 час, 3 минуты, 31 секунда (27.12.2010 - 11:16) totje написал(а):
чтобы тему новую не создавать, спрошу здесь.
такая вот проверка норм будет хоть более менее?

function check($value)
{
if (!is_numeric($value)) {
$value=strip_tags($value);
if (!get_magic_quotes_gpc()) {
$value = addslashes($value);
}
$value=mysql_real_escape_string($value);
$value=htmlspecialchars($value);
$value=trim($value);
$value=encode_html($value);
}
return $value;
}
function encode_html($str,$type='code'){
if($type=='code'){return htmlspecialchars($str,ENT_QUOTES);}
if($type=='encode'){
$trans=get_html_translation_table(HTML_ENTITIES,ENT_QUOTES);
$trans=array_flip($trans);
return strtr($str, $trans);
}
}


о второй ф-ции имею смутное представление, писал не я.

Спустя 21 час, 45 минут, 49 секунд (28.12.2010 - 09:02) totje написал(а):
знающие люди, отпишитесь, пожалуйста

Спустя 1 час, 52 минуты, 38 секунд (28.12.2010 - 10:54) hellmin написал(а):
А для чего это функции? Конечно я понимаю, чтобы обезопасить себя?
Меня тут пугает
		$value=htmlspecialchars($value);
...

$value=encode_html($value);
//в функции encode_html еще раз вызывается
return htmlspecialchars($str,ENT_QUOTES);

Спустя 3 часа, 37 минут, 36 секунд (28.12.2010 - 14:32) totje написал(а):
hellmin
да, мне это тоже не очень понравилось, как увидел, но просто это писал более менее опытный человек, а я еще новичок и мало ли..
то есть вообще эта ф-ция encode какбы лишняя, можно сказать?(даже если опустить то, что htmlspecialchars вызывается два раза)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.