Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122

Инъекции и параметры GET

02.08.2010, 19:47. Показов 2171. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот у меня к примеру такая структура

index.html

HTML5
1
2
3
<a href="doc.php?s=1">первая кнопка</a>
<a href="doc.php?s=2">вторая кнопка</a>
<a href="doc.php?s=3">третья кнопка</a>
doc.php
PHP
1
2
3
4
5
6
7
8
9
<?php
$s=$_GET['s'];
 
if($s==1){$s=10; ...... и всякие вычисления, и записи}
if($s==2){$s=10; ...... и всякие вычисления, и записи}
if($s==3){$s=10; ...... и всякие вычисления, и записи}
 
header("location:index.html");
?>
Читал что такие методы очень легко ломаются инъекциями , подскажите безопасна ли такая структура? И если нет то так можно доработать код чтобы он был более прочным?

P.s. <a href="doc.php?s=1"> - В моем случае именно такой вариант отправки нужен, а $s=10 я сделал так как говорят что если писать ?s=1&s=2 то типа сработает два уровнения и s=1 и s=2.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2010, 19:47
Ответы с готовыми решениями:

Система if ifelse на GET параметр
Есть такая система: if(isset($_GET)){ $get = $_GET; $acp = ROOT.'/engine/classes/admin/'.$get.'.class.php'; ...

В curl не отключается параметр CURLOPT_HEADER
Я не хочу загружать содержимое head однако при отсутствии или отключении параметра CURLOPT_HEADER грузится вся страница. Тестил на...

Не присваивает параметр ссылке!!
Здравствуйте, такая проблема: создаю сайт с базами данных, и у меня при создании файла blok.php не присваивается параметр id из базы...

20
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
02.08.2010, 19:49
Смотря какие операции проводятся с $s
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
02.08.2010, 20:05
Если ты заранее знаешь, что это число, то проще всего получать его как
PHP
1
$s=(int)$_GET['s'];
В результате $s будет только числом... если там было что-то другое, то это превратится в ноль.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 20:11  [ТС]
Цитата Сообщение от arvitaly Посмотреть сообщение
Смотря какие операции проводятся с $s
к примеру такие

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if($s==1){$q="SELECT*FROM table WHERE id=$id"; $r=mysql_query($q);$row=mysql_fetch_array($r);
             $data=$row['data']; $data=$data+10;
             $q="UPDATE table SET data=$data WHERE id=$id"; $r=mysql_query($q);
             $s=10;
             }
 
if($s==2){$q="SELECT*FROM table WHERE id=$id"; $r=mysql_query($q);$row=mysql_fetch_array($r);
             $data=$row['data']; $data=$data+20;
             $q="UPDATE table SET data=$data WHERE id=$id"; $r=mysql_query($q);
             $s=10;
             }
 
if($s==3){$q="SELECT*FROM table WHERE id=$id"; $r=mysql_query($q);$row=mysql_fetch_array($r);
             $data=$row['data']; $data=$data+30;
             $q="UPDATE table SET data=$data WHERE id=$id"; $r=mysql_query($q);
             $s=10;
             }
тоесть должно записаться значение либо +10,+20,+30 . А если судить как мне говорили что $s будет ровняться и 1 и 2 и 3 то запишется +60 , поэтому я поставил если решение верно то s=10 и следующее решение уже небудет выполняться.

Есть ли уязвимость у такого решения?

Добавлено через 2 минуты
Цитата Сообщение от Humanoid Посмотреть сообщение
В результате $s будет только числом... если там было что-то другое, то это превратится в ноль.
но если там и напишут что либо то просто вообще ничего не выполнится , но не все 3 решения сразу, если я правильно понимаю.

Меня вообще интересует , эту конструкцию никак не смогут навредить?

и правда ли то что если написать ?s=1&s=2&s=3 то s принимает 3 значения и могут выполниться все 3 решения?
0
 Аватар для GalaX
701 / 573 / 59
Регистрация: 18.11.2008
Сообщений: 2,147
02.08.2010, 20:13
Цитата Сообщение от Nebiros Посмотреть сообщение
так как говорят что если писать ?s=1&s=2 то типа сработает два уровнения и s=1 и s=2.
Цитата Сообщение от Nebiros Посмотреть сообщение
Читал что такие методы очень легко ломаются инъекциями
ты где такую информацию берешь?
по первому: сработает только s=2 (т.е. самый последний, вроде бы..)
по второму: не сломается, ибо ты явно проверяешь значение if($s==1)
вот только если будет типа такого:
PHP
1
2
3
4
5
if($s==1) {
  // взлом через $s невозможен
} else {
  // а вот тут использование $s без дополнительных проверок становится опасным
}
1
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
02.08.2010, 20:16
PHP
1
2
3
4
5
6
7
8
9
10
11
$s=isset($_GET['s']) ? (int)$_GET['s'] : 0;
if ($s>0)
{
            $q="SELECT*FROM table WHERE id=$id"; $r=mysql_query($q);$row=mysql_fetch_array($r);
             $data=$row['data']; $data=$s*10;
             $q="UPDATE table SET data=$data WHERE id=$id"; $r=mysql_query($q);
}
else
{
            die("Ошибка");
}
Главное проверять хоть с инъекцией, хоть без...
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 20:23  [ТС]
Цитата Сообщение от arvitaly Посмотреть сообщение
Главное проверять хоть с инъекцией, хоть без...
если и небудет переменной то решение просто не выполниться , тоесть все останется без изменений , а вот если все 3 решения выполнятся то будет ошибка.

Но как я выше почитал опасности в данной кострукции нет , либо решение выполнится правильно либо вообще ничего не выполнится , вопрос решен , спасибо.
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.08.2010, 21:13
Я прошу прощения, но зачем так сложно всё?
Вот это
PHP
1
2
3
4
5
if($s==1){$q="SELECT*FROM table WHERE id=$id"; $r=mysql_query($q);$row=mysql_fetch_array($r);
             $data=$row['data']; $data=$data+10;
             $q="UPDATE table SET data=$data WHERE id=$id"; $r=mysql_query($q);
             $s=10;
             }
можно легко решить одним запросом..
PHP
1
2
             $data += 10;
             mysql_query("UPDATE table SET `data` = `data` + ". $data ." WHERE id=$id"; $r=$q);
А про идентификатор и приведение типов, уже сказали.
0
не Администратор ^_^
 Аватар для Unick
988 / 223 / 23
Регистрация: 03.05.2009
Сообщений: 1,493
Записей в блоге: 1
02.08.2010, 21:33
судя из прочитанного
в самое начало добавь:
PHP
1
if(empty($_GET['s']) or !is_numeric($_GET['s'])) exit ("<script>alert('ошибка'); location='index.html'</scropt>");
ну мы проверим на существование, и на число
ведь если что-то дописать к
Code
1
?s=1'
то уже из-за (') вылетит ошибочка
0
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 22:05  [ТС]
Цитата Сообщение от Unick Посмотреть сообщение
то уже из-за (') вылетит ошибочка
но если я не ошибаюсь то в таком случае просто не выполнится решение , тоесть при нормальном обрашении выполняется решение а если ктото захочет помудрить и чтото там дописывать то просто вернется на ту же страницу с темиже данными , решение не выполнится и данные в базе просто не поменяются


Цитата Сообщение от nubo Посмотреть сообщение
Я прошу прощения, но зачем так сложно всё?
Вот это
незнаю просто привычка чтоли писать такой конструкцией , главное что результат тот что нужен был, а медленнее работать скрипт от этого я думаю небудет
0
 Аватар для GalaX
701 / 573 / 59
Регистрация: 18.11.2008
Сообщений: 2,147
02.08.2010, 22:10
Цитата Сообщение от Nebiros Посмотреть сообщение
а медленнее работать скрипт от этого я думаю небудет
будет
один запрос быстрее двух

Цитата Сообщение от Nebiros Посмотреть сообщение
незнаю просто привычка чтоли писать такой конструкцией
от вредных привычек надо отвыкать )
0
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 22:14  [ТС]
Цитата Сообщение от GаlаX Посмотреть сообщение
будет
один запрос быстрее двух
ну значит буду переучиваться , просто с такой кострукцией не сталкивался , по тем урокам что я изучал там везде такая кострукция да и на форумах везде такую видел то и принял ее как за стандарт, просто еще всех фикусов знаю , опыт приходит с практикой
0
не Администратор ^_^
 Аватар для Unick
988 / 223 / 23
Регистрация: 03.05.2009
Сообщений: 1,493
Записей в блоге: 1
02.08.2010, 22:22
Цитата Сообщение от Nebiros Посмотреть сообщение
но если я не ошибаюсь то в таком случае просто не выполнится решение , тоесть при нормальном обрашении выполняется решение а если ктото захочет помудрить и чтото там дописывать то просто вернется на ту же страницу с темиже данными , решение не выполнится и данные в базе просто не поменяются
я вас не понимаю, вы хотите же избавиться от инъекций
А потом говорите что если помудрить, то в базу не запишется, так зачем мудрить?
0
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 22:28  [ТС]
может и не по теме но можно ли упростить такое решение

PHP
1
2
3
4
$q="SELECT*FROM table WHERE id=$id"; 
$r=mysql_query($q);
$row=mysql_fetch_array($r);
$data=$row['data'];
получается вытягиваю одну переменную а делаю это в 4 хода

Добавлено через 4 минуты
Цитата Сообщение от Unick Посмотреть сообщение
я вас не понимаю, вы хотите же избавиться от инъекций
А потом говорите что если помудрить, то в базу не запишется, так зачем мудрить?
главное чтоб в базу записывалось то что нужно и как нужно. Просто нехотелось бы сделать скрипт чтобы с помощью инъекций могли внести в базу не те что нужно данные , либо менять не там где нужно , тоесть просто нужно чтобы скрипт при любых там изменениях в строке не нарушил работу БД.
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
02.08.2010, 22:28
Ходов в любом случае будет столько. Просто записать можно в меньшее количество строк. Лично я не выношу запрос в отдельную переменную:
PHP
1
2
3
$r=mysql_query("SELECT*FROM table WHERE id=$id");
$row=mysql_fetch_array($r);
$data=$row['data'];
А при желании можно так
PHP
1
2
$row=mysql_fetch_array(mysql_query("SELECT*FROM table WHERE id=$id"));
$data=$row['data'];
Но последнее лично считаю уже извращением.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
02.08.2010, 22:34  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Но последнее лично считаю уже извращением.
я так понял скорость выполнения скрипта как в 1 так во 2 случае будет одинакова?
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.08.2010, 22:37
А при желании можно так
Код PHP1
2 $row=mysql_fetch_array(mysql_query("SELE CT*FROM table WHERE id=$id"));
$data=$row['data'];

Но последнее лично считаю уже извращением.
А Вы смогли бы это мотивировать?
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
02.08.2010, 22:52
Цитата Сообщение от Nebiros Посмотреть сообщение
я так понял скорость выполнения скрипта как в 1 так во 2 случае будет одинакова?
Да. PHP придётся выполнить одинаковое количество действий.

Цитата Сообщение от nubo Посмотреть сообщение
А Вы смогли бы это мотивировать?
Что именно? Что я считаю это извращением? Я считаю такой код плохочитабельным.
1
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
02.08.2010, 23:09
PHP
1
2
$row=mysql_fetch_array(mysql_query("SELECT*FROM table WHERE id=$id"));
$data=$row['data'];
Это извращение потому, что при таком подходе не избежать ошибок, а код вполне читабельный
Что мы имеем функция mysql_query выполняет запрос, но мы не знаем прошел он или нет, не знаем вернулась ли нам хоть одна запись или нет.

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

PHP
1
2
3
4
5
6
7
8
9
try
{
     list($data)=mysql_fetch_row(mysql_query("SELECT data FROM table WHERE id=$id"));
}
catch (Exception $e)
{
     write_log(date('Y-m-d H:i:s') .  ", str=" . __LINE__  . ", file=" .  __FILE__ . ", error= " . $e->getMessage() . ", last_mysql_error=" . mysql_error() . "\n");
     die ("Извините, страница не найдена");
}
А Вам бы я посоветовал писать так

PHP
1
2
3
4
5
6
7
8
9
10
$sql="SELECT data FROM table WHERE id=$id";
$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result))
{
    list ($data)=mysql_fetch_row($result);
}
else
{
    die("Страница не найдена");
}
Почему запрос в $sql - потому, что иногда запрос приходится собирать.
0
 Аватар для nubo
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
02.08.2010, 23:22
Что именно? Что я считаю это извращением? Я считаю такой код плохочитабельным.
Вот это не совсем верный подход. Конечно, это микрооптимизация. Но когда работаешь на высоконагруженных ресурсах, каждая микросекунда и каждый бит памяти на учете. А вот это
PHP
1
2
$r=mysql_query("SELECT*FROM table WHERE id=$id");
$row=mysql_fetch_array($r);
перерасход - раз и совсем не добавляет читабельности - два.
Эта запись была бы оправдана при дебаггинге, но его мы тут не наблюдаем. Так зачем лишняя перезапись да еще и с неинформативными переменными?

К слову - применять для этих целей такой артефакт, как mysql_fetch_array() - моветон.
Про сувание в запрос чистой переменной промолчу. Мало ли...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2010, 23:22
Помогаю со студенческими работами здесь

Скриптом передать параметр в текстовое поле
Как можно скриптом передать параметр в текстовое поле на странице? Тоесть что бы скрипт вставлял данные только в одно место.

Параметр value, в поле ввода текста
Здравствуйте, я совсем новичек в php и столкнулся с вопросом, можно ли в поле ввода текста занести какой-то параметр (например почту...

скрипт авторизации vseti.by, неизвестный параметр jsc в POST DATA
Здравствуйте, вот проблема, не могу закончить скрипт авторизации vseti.by. Пока что результат работы скрипта Неизвестная ошибка...

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

Трудности с SQL-инъекцией и XSS
Вечер добрый, форумчане! Помогите советом, есть несколько вопросов. 1. Есть скрипт авторизации - форма &lt;form...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru