Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 23.06.2018
Сообщений: 7

Дыры в коде

23.06.2018, 12:45. Показов 2500. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, недавно начал изучать php и решил для (игрового) сайта на движке yii написать простенький код для активации промокодов, не подскажите где здесь четкие дыры и как их можно закрыть или написать код более грамотно. Заранее спасибо за помощь.
P.S. Весь это код я написал в файле где отображается вся информация главной страницы, то есть личный кабинет, надписи на странице и т.п.


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
    if( isset( $_GET['my_button'] ) ) {
        $servername = "777.221.233.777";
        $username = "root";
        $password = "1234";
        $dbname = "pow";
        $conn = mysqli_connect($servername, $username, $password, $dbname);
 
        if (!$conn) {
            die("Faild: " . mysqli_connect_error());
        }
    
        $sql = "SELECT codes FROM promocode";
        $result = $conn->query($sql);
        $qwe = $_GET['entrycode'];
        $users = Power::userName();
        
            
        
        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                $promo = $row["codes"];
                echo "<br> code: " . $row["codes"];
                if ($qwe == $promo) {
                    
                    
 
                    $sql = "DELETE FROM promocode WHERE codes = '$qwe';";
                    
                    $sql .= "UPDATE users SET money = money + 100 WHERE login = '$users';";
 
                    $sql .= "INSERT INTO promocode_log (code)
                        VALUES ('$qwe')";
                } else {
                    echo "Такого промокода нет :'(";
                }
 
 
            }
        }
 
 
        if (mysqli_multi_query($conn, $sql)) {
            echo "ok";
        }
        mysqli_close($conn);
    }
    ?>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2018, 12:45
Ответы с готовыми решениями:

Чёрные дыры
Друзья, подскажите безграмотному, но любопытному человеку :) Задумался о размере чёрной дыры... например, до какого размера надо сжать...

Чёрные дыры
Здравствуйте! Пишу научно-фантастический роман &quot;За горизонтом событий&quot;. Мне бы хотелось знать, в деталях и подробностях если можно, что...

Дыры на сайте
Добрый всем день, хочу получить информацию о уязвимых местах сайта которыми могут воспользоваться хакеры... Заранее благодарю!!!!

10
 Аватар для monahoff
40 / 40 / 23
Регистрация: 26.01.2012
Сообщений: 317
23.06.2018, 15:58
Лучший ответ Сообщение было отмечено Avam как решение

Решение

Первое...подключения к бд должно быть в отдельном файле (кстати во фреймворке именно так и должно быть)...если в этом скрипте у тебя будет какой-то глюк, трейс ошибки (при неверной настройке фреймворка) может выкинуть у тебя кусок кода с данными подключения к бд...и тогда все!

Добавлено через 2 минуты
Второе...переменная $qwe должна проходить контроль - фильтрацию, экранирование...короче нельзя пихать данные из запроса сразу в базу, иначе однажды словишь инъекцию и тогда тоже все!

Добавлено через 1 минуту
Третье...всякие манипуляции с деньгами лучше осуществлять с помощью транзакций (почитай мануалы про MySql), чтобы можно было откатить все изменения обратно!

Добавлено через 7 минут
Четвертое...зачем брать все промокоды из таблицы потом сверять с тем что пришел? Логичнее ведь так
PHP
1
2
3
$filter_qwe = addslashes ($_GET['entrycode']); //экранированное значение из GET
$sql = "SELECT * FROM promocode where codes = '".$filter_qwe."'";
//далее, если есть результат, то работаем с этим промо
Добавлено через 3 минуты
Шестое...инъекция в твоем случае скорее всего не пройдет, но желательно все делать по канонам, а лучше всего для работы с бд использовать PDO (и подготовленные выражения)...во фреймворке это тоже все есть!

Добавлено через 2 минуты
Седьмое...ну это просто подарок для хакера)))
PHP
1
echo "<br> code: " . $row["codes"];
в цикле ты выбрасываешь все промокоды...то есть человек видит то, что видеть не должен!!!


Добавлено через 19 минут
Восьмое...
PHP
1
$sql = "DELETE FROM promocode WHERE codes = '$qwe';";
удалять из базы ничего не советую...лучше придумать систему стейтов...типа 100 - код не активирован, 200 - активирован...плюс ко всему лучше указывать дату активации, чтобы потом была статистика и прочее...в общем, чем больше данных сохраняешь тем потом проще анализировать какие-то баги!

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

Добавлено через 1 минуту
Заключение...в твоем коде нет дыр...это одна сплошная дыра))) Не переживай, все приходит с опытом!!!
1
2 / 2 / 0
Регистрация: 23.06.2018
Сообщений: 7
23.06.2018, 16:20  [ТС]
Спасибо огромное, что все так подробно расписали, буду работать. Очень помогли, еще раз спасибо)
0
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
23.06.2018, 16:31
Avam, Тебе лучше сразу продумать все. Например, промокод можно будет 1 раз использовать или несколько. Промокод будет давать всегда одну сумму бонуса или разный промокод с другой суммой. На начальном этапе это легче сделать, чем когда уже у тебя будут пользователи

Добавлено через 2 минуты
Цитата Сообщение от monahoff Посмотреть сообщение
Заключение...в твоем коде нет дыр...это одна сплошная дыра)))
И не слушай этого многоточника, никак свою мысль закончить не может.

Цитата Сообщение от Avam Посмотреть сообщение
$sql = "DELETE FROM promocode WHERE codes = '$qwe';";
Сюда можно было бы подсунуть sql иньекцию, но это сделать не даст
Цитата Сообщение от Avam Посмотреть сообщение
if ($qwe == $promo) {
Так что, в принципе дыр нет
1
2 / 2 / 0
Регистрация: 23.06.2018
Сообщений: 7
23.06.2018, 16:31  [ТС]
Да да, логику я допишу, просто хотелось узнать все уязвимости и для начала их закрыть)
Значит получается, что из косяков тут в общем плане только кривое подключение к бд?
0
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
23.06.2018, 16:38
Avam, Если у тебя одна страница и больше нигде нет подключений к базе, то можно оставить. Но, если уже несколько, то лучше вынести в отдельный класс, как например у тебя тут
Цитата Сообщение от Avam Посмотреть сообщение
$users = Power::userName();
Ты представь, если у тебя пароль от бд сменится или имя бд, тебе вручную надо будет отредактировать все файлы, а так только 1.
Тут еще нужно добавить выход из цикла, если промокод найден. А то, у тебя все действия с ним сделаны, но ты продолжишь перебирать все промокоды дальше
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 if ($qwe == $promo) {
                    
                    
 
                    $sql = "DELETE FROM promocode WHERE codes = '$qwe';";
                    
                    $sql .= "UPDATE users SET money = money + 100 WHERE login = '$users';";
 
                    $sql .= "INSERT INTO promocode_log (code)
                        VALUES ('$qwe')";
                    break;
                } else {
                    echo "Такого промокода нет :'(";
                }
И нажимай пожалуйста на ник, чтобы оповещение о новом сообщении приходило
0
 Аватар для monahoff
40 / 40 / 23
Регистрация: 26.01.2012
Сообщений: 317
23.06.2018, 16:38
PHP
1
echo "<br> code: " . $row["codes"];
вот эта строка самая опасная получилась...она просто сливает всю базу промо-кодов и не важно что ввел пользователь...покажет все!!! это гран-при уязвимость))
0
2 / 2 / 0
Регистрация: 23.06.2018
Сообщений: 7
23.06.2018, 16:46  [ТС]
edward_freedom, понял спасибо, как раз это уже реализовано в config.php там настраивается подключение к базе данных.

Добавлено через 43 секунды
monahoff, эта строчка чисто для теста, чтобы видеть как всё работает, забыл ее стереть перед тем как сюда код залить)
1
 Аватар для monahoff
40 / 40 / 23
Регистрация: 26.01.2012
Сообщений: 317
23.06.2018, 16:49
edward_freedom срет во всех ветках...по делу пиши, а не указывай как мне излагать мысль
0
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
23.06.2018, 16:54
monahoff,

Не по теме:

процитируй сообщение, где я тебе что то указал

0
2 / 2 / 0
Регистрация: 23.06.2018
Сообщений: 7
23.06.2018, 16:55  [ТС]
Так же создал маленькую элементарную программку на C# для генерации промокода и записи его в базу. Тут только основа, нет исключений и тд, но вдруг кому будет интересно сможет доделать под свои цели.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using MySql.Data.MySqlClient; 
using System.Data.SqlClient; 
 
namespace PromoCode 
{ 
public partial class Form1 : Form 
{ 
SqlConnection sqlConnection; 
 
 
public Form1() 
{ 
InitializeComponent(); 
} 
 
 
private void Form1_Load(object sender, EventArgs e) 
{ 
 
} 
 
 
 
private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
 
} 
 
private async void button1_Click(object sender, EventArgs e) 
 
{ 
string connectionString = "server=111.323.121.123;user=root;database=pow;password=1234;SslMode=none;"; 
MySqlConnection conn = new MySqlConnection(connectionString); 
conn.Open(); 
 
Random rnd = new Random(); 
int value = rnd.Next(156345, 984678); 
 
string sql = "INSERT INTO promocode (codes) VALUES(@value)"; 
 
 
MySqlCommand command = new MySqlCommand(sql, conn); 
command.Parameters.AddWithValue("value", value); 
command.ExecuteScalar(); 
 
textBox1.Text = value.ToString(); 
 
conn.Close(); 
 
} 
 
private void button2_Click(object sender, EventArgs e) 
{ 
Clipboard.SetText(textBox1.Text); 
 
} 
} 
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.06.2018, 16:55
Помогаю со студенческими работами здесь

Дыры на сайте
Привет. Нужна помощь по PHP. Решил поправить скрипт сайта (вообщем сайт)из свободного доступа перед установкой. Больше половины косяков...

Как залатать дыры?
Здравствуйте. Имеем простенький колл-центр. При поступлении звонка ему присваивается порядковый номер, т.е. 1, 2, 3, ..., n, n+1... и...

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

Найти на сайте дыры
Помогите пожалуйста найти дыры вот на этом сайте http://kipm.dyndns-web.com:8080/Institut/, очень буду признателеН) Поставил новую...

Дыры в веб-сайте
Как найти и устранить дыры в своем приложении ?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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