Веб - серверді қорғау
Аннотация
Тема дипломной работы - Разработка Web-приложения с использованием системы защиты.
Цель работы - Разработка Web-приложения с использованием системы защиты с использованием языка программирования Golang.
При создании программы использовался язык программирования Golang, с актуальным и новейшим набором библиотек. При работе программа должна выполнять функцию передачи SSH ключей.
Произведен процесс расчетов окупаемости, расходов и доход от создаваемого продукта. Учтены нынешние цены на электроэнергию, закупаемые товары.
Рассмотрена работа с точки зрения безопасности помещения, где происходит процесс разработки программного продукта.
Аңдатпа
Дипломдық жұмысынң тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Жұмыстың мақсаты - Golang бағдарламалау тілін қолдана отырып, қорғаныс жүйесін қолдана отырып, Web қосымшасын жасау.
Бағдарламаны құру кезінде кітапханалардың өзекті және соңғы жиынтығы бар Golang бағдарламалау тілі қолданылды. Жұмыс кезінде бағдарлама SSH кілттерін беру функциясын орындауы керек.
Өндірілген өнімнің өтелуін, шығыстарын және кірісін есептеу процесі жүргізілді. Электр энергиясының, сатып алынатын тауарлардың қазіргі бағасы ескерілді.
Жұмыс бағдарламалық өнімді әзірлеу процесі жүретін бөлменің қауіпсіздігі тұрғысынан қарастырылады.
Annotation
The topic of the thesis is the Development of a Web application using a security system.
The purpose of the work is the development of a Web application using a security system using the Golang programming language.
When creating the program, the Golang programming language was used, with an up-to-date and newest set of libraries. When working, the program must perform the function of transferring SSH keys.
The process of calculating the payback, expenses and income from the created product has been carried out. Current electricity prices and purchased goods are taken into account.
The work is considered from the point of view of the security of the room where the process of developing a software product takes place.
Мазмұндама
1 Веб-серверді қорғау 8
1.1 Веб-сервер мен қолданба серверін қорғау жолдары 8
1.2 SSH кілттерін құру 9
2 Golang бағдарламалау тілі 12
2.1 Golang туралы түсінік 12
2.2 Бағдарламалау тілінің негіздері 13
2.3 Go циклдары 17
2.4 Gin шеңбері 18
2.5 Pgx кітапханаларының жиынтығы 18
2.6 Go жобасын құру 20
3 Практикалық бөлімі 22
3.1 Қолданылатын бағдарламалық жасақтамалар 22
3.2 Жобаға арналған программаны әзірлеу 33
3.3 Шабуыл процессі 37
4 Тіршілік қауіпсіздігі 41
4.1 Инженердің жұмыс жағдайын талдау 41
4.2 Кондиционерлеу және ауаны жаңарту жүйелерін есептеу 45
4.3 Тіршілік қауіпсіздігі бөлімінің қорытындысы 51
5 Технико - экономикалық негізделуі 52
5.1 Жұмыс туралы ақпарат және қажеттілігін негіздеу 52
5.2 Бағдарламалық қамтаманың өңделуінің еңбек өнімділігінің есептелуі 52
5.3 Бағдарламалық қамтаманы өңдеуге кеткен шығынның есептелуі 54
5.4 Қосымша шығындар статьясы 55
5.6 Бағдарламалық өнімді иемденудегі кәсіпорындардың бірмезгілдегі шығындарын есептеу 59
5.7 Таза ағымдағы құндылықты есептеу 60
5.8 Экономика бөлімінің қорытындысы 61
Қорытынды 62
Әдебиет тізімі 63
Қосымша А 65
Кіріспе
Дипломдық жобаның тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Дипломдық жобасының есептері:
1) SSH кілттері туралы мәліметтерді алу;
2) Бағдарламалау тілін қолдану арқылы бағдарламаны құру қасиеттерін зерттеу;
3) Golang бағдарламалау тілі арқылы ақпаратты қорғау жүйесін әзірлеу;
4) Тіршілік қауіпсіздігі бөлімі үшін есептеулер жүргізуге;
5) Экономика бөлімінде дипломдық жобаның есебін жүргізу.
Дипломдық жобаның ғылыми жаңалықтары: Go жабдықтау тілін қолдана Web қосымшасын әзірлеу.
Дипломдық жобаның өзектілігі - - Go жабдықтау тілін қолдана отырып қарастыру.
Дипломдық жобаның зерттелу дәрежесі - диплмодық жоба толығымен зерттелді және іске асыруға дайын.
Дипломдық жобаға қолданатын әдебиет көздерін талдау - дипломдық жобада пайдаланылатын әдебиеттер интернет ресурстарынан, АЭжБУ университетінің кітапханасынан, сондай-ақ Абылай хан көшесіндегі Ұлттық кітапханадан алынды.
Дипломдық жобаны талдау нысандары - дипломдық жобаны талдау формалары-оларға Go жбадықтау тілі туралы ақпарат, кестелер және бағдарламалық өнімнің скриншоттары кіреді.
Веб - қосымшалардың қауіпсіздігі 10 жылдан астам уақыт бойы ақпараттық қауіпсіздіктің негізгі тенденциялары мен қауіптерінің ондығына кірді. Шынында да, қазіргі заманғы бизнес-процестер мен күнделікті өмір веб-қосымшаларды әр түрлі аспектілерде қолдануға байланысты: күрделі инфрақұрылымдық жүйелерден IoT құрылғыларына дейін. Дегенмен, веб-қосымшаларды қорғауға арналған арнайы құралдар өте аз және көбінесе бұл тапсырма әзірлеушілерге жүктеледі (немесе ол шешіледі деп үміттенеді). Бұл әртүрлі құрылымдарды, санитарияны, деректерді тазалауды, қалыпқа келтіруді және т. б. Алайда, бұл құралдарды қолданған кезде де интернет қауіпсіз бола алмады, сонымен қатар "классикалық желінің" барлық осалдықтары мобильді дамуға көшті. Бұл мақалада осалдықты қалай болдырмауға болатындығы туралы емес, веб-қосымшаны веб-қосымшаның брандмауэрі арқылы оны пайдаланудан қалай қорғауға болатындығы туралы айтылады.
Веб-сервердің дұрыс конфигурациясынан сайтты қажетсіз файлдар мен Код бөлімдерінен тазарту және минималды бақылау. Шынында да, арналар әлсіз болды, DDoS таралмады, осалдықтар аз болды, қосымшалар қарапайым болды және қолданушылардың әрекеттері бірнеше сценарийлермен болжалды.
Уақыт өте келе веб-қосымшалар, серверлік инфрақұрылым және өзара әрекеттесу күрделене түсті, ал код "шабуыл беті"болып табылады. Интернет өте танымал болды, қаржылық өсу мүмкіндіктері пайда болды-бұл, әрине, осы салада басқа біреудің жұмысын заңсыз пайдаланғысы келетіндерді қызықтырды.
Веб-қосымшаларға жасалған шабуылдардың саны мен әртүрлілігі экспоненциалды түрде өсе бастады, оларды шартты түрде екі санатқа бөлуге болады (ақпараттық қауіпсіздік тұжырымдамасына негізделген):
ақпараттың құпиялылығын бұзуға бағытталған қауіптер;
ақпараттың қолжетімділігін бұзуға бағытталған қауіптер.
Біріншіден, бұл осалдықтарды пайдалануға, екіншіден, қызмет көрсетуден бас тартуға қатысты. Егер қосымшаны жоспарлау және әзірлеу кезеңінде кейбір шабуылдардан аулақ болуға тырысу мүмкін болса. Веб-қосымшаны интернетте орналастырған кезде сайт (әсіресе танымал қызмет саласы немесе компания) барлық бағытта шабуыл жасай бастайды:
осалдықтарды пайдаланудың автоматтандырылған жүйелері;
кәсіби киберқылмыскерлер;
жаңадан келгендер, әуесқойлар.
Олардың әртүрлі әдістері, тәсілдері мен құралдары бар -- оларды біріктіретін бір мақсат - веб-қосымшаны бұзу немесе бұзу.
1 Веб-серверді қорғау
1.1 Веб-сервер мен қолданба серверін қорғау жолдары
Веб-сервер мен қолданбалы серверді қорғау-бұл веб-трафикті, жергілікті кәсіпорын желісін және онда сақталған ақпаратты қорғау мақсатында осы серверлерге бағытталған қауіптерді жою шараларының жиынтығы.
Веб-сервер-бұл HTTP сұрауларына қызмет көрсететін сервер. Оның басты міндеті-сайттың статикалық мазмұнын көрсету. Сонымен қатар, ол веб-беттердің жұмысын автоматтандырады, пайдаланушыларға рұқсат береді және аутентификациялайды, пайдаланушы сұрауларының журналын жүргізеді, қауіпсіз HTTPS қосылымдарын қолдайды. Мұндай веб-сервер статикалық деп те аталады. Ол қолданба серверінсіз бөлек жұмыс істей алады.
Статикалық веб-сервер қолданба серверімен және дерекқормен бірге жұмыс істегенде, ол динамикалық мазмұн сұрауларын қолданба серверіне жібереді. Бұл жағдайда оны динамикалық деп атайды.
Қолданба сервері-бұл HTTP және HTTPS-пен ғана емес, басқа протоколдармен де жұмыс істейтін құрылым (бағдарламалық платформа). Ол пайдаланушылардың динамикалық және статикалық мазмұнмен өзара әрекеттесуін қамтамасыз етеді.
Веб - сервер мен қосымшалар сервері Бағдарламалық жасақтамаға енуден, трафикті ұстап қалудан және маңызды ақпаратқа рұқсатсыз қол жеткізуден қорғауды қажет етеді.
Веб-серверді ақпараттық қорғау жөніндегі іс-шараларды жүзеге асырар алдында сервер жұмысының жүйелеріне аудит (талдау) жүргізу қажет. Бұл қауіптің түрін және қауіпсіздікті қамтамасыз ету әдістерін анықтауға көмектеседі.
Қауіптің негізгі түрлері:
операциялық жүйеге хакерлік шабуыл және бағдарламалық жасақтаманы қамтамасыз ететін файлдарды өзгерту;
трафикке рұқсатсыз қол жеткізу және оны ұстап алу;
Серверге DDoS шабуылдары;
бұзылу немесе оның істен шығуы нәтижесінде серверлік жабдықтың жұмысындағы қателер;
веб-серверге қызмет көрсетудегі қателер сияқты адам факторы;
веб-серверді қасақана бұзу және оны пайдалану кезінде қателіктер жіберу.
Веб-сервер мен қолданба серверін қорғаудың мақсаты оларға рұқсатсыз кіруді болдырмау болып табылады. Ол үшін серверлердегі ақпаратқа қол жеткізу құқықтарының аражігін ажырату жүргізіледі. Трафикті қорғауды қамтамасыз ету үшін ақпаратты шифрлау және оны қорғалған байланыс арналары арқылы беру әдістері қолданылады.
Қауіпсіздік үшін қолданба сервері қолданбалардың брандмауэрін (Web application firewall немесе қысқаша WAF) пайдаланады. Бұл қолданбалы деңгейде жұмыс істейтін мониторлар мен сүзгілер кешені. WAF кіріс және шығыс трафикті нақты уақыт режимінде талдау және шешім қабылдау үшін қолданба серверінің үстінде орналасқан қабылдамау немесе рұқсат беру.
1.2 SSH кілттерін құру
Ашық және жабық SSH кілттерінің жұбы-бұл криптографиямен жасалған арнайы кодтар. Олар сенімді пайдаланушыны анықтауға мүмкіндік береді және тиімділігі бойынша логиндер мен парольдерді құрудан асып түседі.
Бұл технологияда адам факторы, сондай-ақ есептеу технологияларының көмегімен парольді әдейі таңдау толығымен алынып тасталады. Теориялық тұрғыдан кілттердің тіркесімін шешуге болады, бірақ бұл ерекше жағдайларда жүзеге асырылуы мүмкін тым көп уақытты қажет ететін және ұзақ процесс.
Жүйе әкімшісі кез-келген операциялық жүйеде, соның ішінде ашық бастапқы Unix жүйелерінде SSH кілттерін теңшей алады.
Брандмауэрді орнату
Брандмауэрді желілік экран, брандмауэр немесе брандмауэр деп те атайды. Бұл веб-серверді ашық порттар мен трафик арқылы рұқсатсыз кіруден қорғайтын бағдарламалық құрал немесе Бағдарламалық құрал шешімі. Кіру корпоративтік қауіпсіздік саясатына сәйкес желі экранының параметрлерімен реттеледі.
Брандмауэр алдын ала аудит нәтижелеріне және қосымша қорғау әдістеріне қарамастан кез келген ақпараттық қауіпсіздік жүйесі үшін міндетті болып табылады.
VPN және Private Networking -- бұл серверлер мен пайдаланушылар арасында Қауіпсіз байланысы бар виртуалды жеке желіні және жеке желіні құру технологиясы.
Vpn және Private Networking компанияның қажеттіліктеріне сәйкес келеді. Жеке желінің бар екендігі туралы оның пайдаланушылары ғана біледі. Бұл сыртқы қауіптерді азайтуға мүмкіндік береді.
1.1 сурет - VPN жұмыс принципі
Веб-серверді қорғаудың стандартты әдістері оны DDoS шабуылдарынан қорғай алмайды.
Веб-Сервердің DDoS шабуылдарынан қауіпсіздігі үшін брандмауэр, iptables және ipset утилиталары және боттарды бұғаттауға арналған сценарийлер қажет.
PKI - және SSLTLS-шифрлау
Бұл пайдаланушыны сәйкестендіру сертификаттарын құру және шифрланған ақпаратты SSLTLS криптографиялық протоколы арқылы беру үшін ашық кілт инфрақұрылымын (PKI) құру.
1.2 сурет - SSH кілттері
Ол үшін қол жеткізу құқығын тексеру үшін сертификаттау және сертификаттарды басқару орталығы құрылады.
1.3 Оқшауланған ортаны құру
Бұл қосымшалар мен бағдарламалардың оқшауланған жұмыс ортасын құру, оларды бір-бірінен бөліп, өз серверлеріне бөлу. Оқшаулау дәрежесі әр бағдарламалық өнімнің жүйелік талаптарына және оның бүкіл АТ инфрақұрылымының жұмысындағы маңыздылық деңгейіне байланысты.
Осылайша, бағдарламалық жасақтама қауіп-қатерден және бір процеске рұқсатсыз қол жеткізудің бүкіл жүйесінің жұмысына әсер етуден оқшауланады.
Веб-сервер қандай амалдық жүйеде жұмыс істейтініне қарамастан, антивирустық бағдарламаларды орнатуды елемеу ұсынылмайды. Кез-келген файлды жұқтырған жағдайда, антивирустық бағдарлама вирустың бүкіл жүйені басып алуына жол бермейді.
Деректердің қолжетімділігін қамтамасыз ету
Веб-сервер мен қосымшалар серверін сыртқы қауіптерден қорғаудан басқа, ішкі қауіптерден де шаралар қолданылады: қызметкерлердің қателіктері, жабдықтың істен шығуы немесе бағдарламалық жасақтама. Шешімдер кешені деректерді қорғауға және техникалық құралдардың ақауларға төзімділігін қамтамасыз етуге бағытталған.
Веб-серверді қорғауды қамтамасыз етудің барлық сипатталған тәсілдерін бірге немесе бөлек жүзеге асыруға болады.
2 Golang бағдарламалау тілі
2.1 Golang туралы түсінік
Голанг Google-да әзірленген және оны Роберт Гриземер, Роб Пайк және кен Томпсон жасаған. Ол алғаш рет 2007 жылдың 21 қыркүйегінде талқыланды және ақырында 2009 жылдың 10 қарашасында Ашық бастапқы жоба болды.
Go веб-сайтында хабарланғандай, бұл тіл жұмыс істеу үшін бағдарламалау тілін таңдау кезінде тиімді құрастыру, тиімді орындау немесе бағдарламалаудың қарапайымдылығы арасындағы қажетті таңдаудың арқасында дүниеге келді. Осылайша, Go-ның негізгі мақсаты статикалық теру арқылы құрастырылған тілдің тиімділігі мен қауіпсіздігін сақтай отырып, түсіндірілетін және динамикалық терілген тілдің қарапайымдылығына қол жеткізетін тіл құру болды. Тағы бір басты мақсат-параллелизмді тілдің басымдықтарының біріне айналдыру арқылы көп ядролы процессорлардың өсуінің артықшылықтарын пайдалану .
Go мақсаттарын тереңірек түсіну үшін мен Роб Пайк жазған осы мақаланы оқуды ұсынамын. Осы мақалада айтылған кейбір мақсаттар шешімін табуды қамтиды:
баяу құрастырулар;
бақыланбайтын тәуелділіктер;
әр бағдарламашы тілдің әр түрлі ішкі жиынтығын қолданады;
бағдарламаны нашар түсіну (кодты оқу қиын, нашар құжатталған және т. б.);
күш-жігерді қайталау;
жаңарту құны;
нұсқаның қисаюы;
Автоматты құралдарды жазудың қиындығы;
кросс-тілдік құрылымдар.
Google үлкен кодтық базалары бар ауқымды жүйелермен жұмыс істейтінін ескере отырып, Go ең алдымен үлкен жүйелердегі ең көп кездесетін мәселелерді шешуге тырысатын "бағдарламалық жасақтама қызметінде" тіл ретінде дамыды.
Жұмыс
Сәлем Әлем!
Ал, бәрі туралы! Go-да алғашқы бағдарламамызды жазуды бастайық. Келесі бөлімдерде мен бағдарламамыздың әр бөлігін толығырақ түсіндіремін. Біз "Сәлем әлемін" басып шығара аламыз!"кодтың келесі бірнеше жолдары бар хабарлама:
негізгі пакетимпорт
"фмт"func main() {
fmt.Println("Привет, мир!") }
Жоғарыда келтірілген фрагменттің алғашқы түсіндірмесін жасайық, осылайша біз алғашқы құрылыс блоктарын ала бастаймыз. Go бағдарламалары пакеттерде ұйымдастырылған және бір арнайы пакет орындалатын командаларда қолданылуы керек "негізгі" болып табылады. Енді біз бағдарламамызға пакеттерді қосуға мүмкіндік беретін импорттау операторына ауыса аламыз. Айта кету керек, біз келесі синтаксисі бар бірнеше пакетті импорттай аламыз:импорт
("пакет_1"
"пакет_2" )
Біздің мысалда біз "fmt" бумасын көреміз , ол әдетте стандартты кірістен оқу немесе стандартты шығысқа жазу үшін қолданылады. Біз бұл пакетті осы дипломдық жұмыс дамыған сайын егжей-тегжейлі зерттейтін боламыз.
Соңында, біз таба аламыз FUNC main() біздің Go бағдарламамыздың негізгі функциясын жариялайтын таңқаларлық емес хабарландыру.
2.2 Бағдарламалау тілінің негіздері
Go-статикалық терілген тіл. Бұл дегеніміз, динамикалық терілген тілдерден айырмашылығы (мысалы, JavaScript немесе Python), сіз бастапқыда айнымалы түрін жариялайсыз және оны ұстанасыз. Мысалы, егер сіз бүтін айнымалыны жарияласаңыз, ол өмірлік циклінің кейінгі кезеңінде жол бола алмайды. Неғұрлым егжей-тегжейлі және қатаң болғанымен, айнымалы түрі әрқашан бірдей екенін ескере отырып, компиляторға кодты оңтайландыруға көбірек мүмкіндік береді. Тілдерді статикалық және динамикалық терумен толығырақ салыстыру үшін осы мақаланы қараңыз.
Алғашқы айнымалыларымызды жариялайық. Ол үшін біз келесі синтаксисті қолдануымыз керек:
var аты түрі [=мәні]
Мен толтырғыш ретінде және арасындағы мәндерді қолданамын, ал квадрат жақшалар [] оператордың қосымша бөлігін білдіреді. Осылайша, келесі екі мәлімдеме де дұрыс болады:
Var i int
var J string = "Сәлем"
J айнымалысын "Сәлем" жолымен нақты инициализациялағанымызбен, бұл i айнымалысы да инициализацияланатынын ескеріңіз: тек жарияланған айнымалылар "нөлдік мәнмен" инициализацияланады, ол сандар үшін 0-ге, жолдар үшін "" және логикалық айнымалылар үшін жалған.
Сонымен қатар, келесі синтаксисі бар кодтың бір жолын пайдаланып, бір типтегі бірнеше айнымалыларды жариялауға (және қажет болған жағдайда инициализациялауға) болады:
var "ат_1", "ат_2 "" тип " [="мән_1", "мән_2"]
Біз бұл мүмкіндікті мысалмен суреттейміз:
айнымалы i, j Int = 12, 27
Алайда, голангтың мақсаты тиімді кодты құру ғана емес, сонымен қатар бағдарламалау процесін жеделдету болды. Сондықтан біз айнымалыны Walrus: = операторының көмегімен инициализациялай аламыз. Осы операторды қолдана отырып, синтаксис қысқа болады және айнымалының түрін нақты анықтаудың қажеті жоқ (Go мұны біз үшін шешеді, мысалы, типтің шығысы). Дегенмен, walrus операторын тек функция ішінде пайдалануға болатынын ескеру маңызды. Келесі мысал айнымалының декларациясы мен инициализациясының қаншалықты қарапайым болатынын көрсете алады:
к: = 42.0
Сонымен қатар, Go айнымалының көрінуін оның атына қарай анықтауға мүмкіндік береді. Егер сіздің айнымалыңыз кіші әріптен басталса, ол пакеттің ішінде қалады. Алайда, егер бірінші әріп бас әріппен жазылса, ол басқа пакеттерге көрінеді (немесе экспортталады).
Мен осы бөлімді келесі ескертулермен аяқтағым келеді:
барлық айнымалыларды пайдалану керек, әйтпесе Go компиляция уақытының қатесін қайтарады.
айнымалыны қайта жариялауға жол берілмейді (көлеңкеден басқа ).
жоғарыда келтірілген Walrus операторының мысалы float64 типті айнымалыны жасайды. Егер біз float32 жасағымыз келсе, толығырақ жарнаманы пайдалануымыз керек.
Сіз сондай-ақ рұқсат етілген деректер түрлерінің тізімін қарап шығуға қызығушылық танытуыңыз мүмкін .
Келесі синтаксисті қолдану арқылы мәнді басқа түрге түрлендіруге (немесе түрлендіруге) болады:
түрі(айнымалы)
Әрине, орнында келтіруге жол берілмейді, өйткені біз статикалық теру арқылы тілде жұмыс істейміз:
Var i int = 12
var j float32 = float32(i)
Енді бүтін санды жолға түрлендіруге тырысайық:
a: = 65
b: = жол (a)
fmt.Println(b)
Егер сіз жоғарыдағы кодтың 3 жолын іске қоссаңыз, ол біз күткендей "65" орнына "A" шығаратынын көресіз. Себебі бүтін санды жолға тікелей түрлендіру берілген санның юникод таңбасын қайтарады ("А" -- юникодтағы № 65 таңба).
Сонымен... бүтін санды жолға қалай түрлендіруге болады? Ол үшін бізге strconv пакеті қажет. Атап айтқанда, бұл жағдайда бізге Itoa функциясы қажет болады (ASCII ішіндегі бүтін) :
негізгі пакет импорты ("fmt"
"strconv"
) func main () {
a: = 65
b: = strconv.Itoa(a)
fmt.Printf("%v, %T\n", b, b) }
Егер сіз жоғарыдағы фрагментті іске қоссаңыз, b қазір "65"екенін көресіз.
Сондай-ақ, const кілт сөзін пайдаланып тұрақты мәндерді анықтауға болады:
тұрақты с = 123
Енді z айнымалысы 123 тұрақты мәнге ие болады және сіз оны өзгерте алмайсыз. Сондай-ақ, морж операторы тұрақтыларға қолданылмайтынын қосқым келеді.
Пікірлер орны
Кодта Түсініктеме жазу әріптестеріңізге (және болашақта өзіңізге) код үзіндісін түсіндіруге көмектеседі. Сіз келесі синтаксиспен бір жолды Түсініктеме жаза аласыз:
пікір
... немесе осыған ұқсас көп жолды пікірлер:
* пікір *
көрсеткіштер
Go мәннің жад мекенжайын қамтитын көрсеткіштермен жұмыс істеуге мүмкіндік береді. Көрсеткішті келесі синтаксиспен анықтай аламыз:
var көрсеткіш атауы * түрі
Мысал ретінде:
вар i * int
Біз сондай-ақ пайдалана аламыз &көрсетілген айнымалыға көрсеткішті қайтаратын оператор:
var көрсеткіш атауы * түрі = & айнымалы
Соңында, меңзердің мазмұнына * оператор арқылы қол жеткізе аламыз:
* көрсеткіш атауы
Қорытындылай келе, көрсеткіштермен қалай жұмыс істей алатынымызды қарастырайық:
Негізгі пакет импорттау " FMT " FUNC main () {
var i int = 27
var p *int = &i
fmt.Println(*p)
*p += 1
fmt.Println(i) }
Бұл мысалда біз 27 мәні бар бүтін IC айнымалысын, содан кейін оған сілтеме жасайтын p көрсеткішін жасадық. Содан кейін біз айнымалы мәнді көрсеткіш арқылы басып шығардық. Соңында, біз көрсеткіш арқылы айнымалы мәнін арттырдық және соңғы мәнді басып шығардық.
Біз келесі синтаксисті пайдаланып Go функциясын жасай аламыз:
func name([var_1 type_1, var_2 type_2]) [return_type] {}
Жоғарыда келтірілген псевдокод үзіндісінде мен мысал ретінде екі аргументті қостым, бірақ біз нөлдік немесе одан да көп аргументтердің функцияларын бере аламыз. Мысал көрейік:
функция көбейту (i Int, j int) int {
i * j қайтару }
Қайтару мәні функцияның қолтаңбасында жарияланған қайтару мәнімен бірдей екенін ескеріңіз. Енді біз бұл мүмкіндікті келесідей шақыра аламыз:
көбейту (3, 11)
Go екі (немесе одан да көп) дәйекті аргументтер бірдей типте болған кезденыйам синтаксисті ұсынады. Біз бұл айнымалылардың түрін оны соңғы деп жариялау арқылы жариялай аламыз:
функция көбейту (i, j Int) int {
i * j қайтару}
Жоғарыдағы мысалда екі Аргументтің де Int түрі бар.
Біз функцияларға бірнеше мәндерді қайтара аламыз:
func personal_info() (string, int) {
name: = "John"
age: = 27
return name, age}
... немесе аталған мәндерді қайтару ("жалаңаш қайтару" деп те аталады):
func ops (x, y float64) (mult, div float64) {
mult = x * y
div = x y
return}
Бұл жағдайда біз айнымалыларды қайтару мәлімдемесінде көрсетудің қажеті жоқ, өйткені олар функцияның қолтаңбасында көрсетілген. Сонымен қатар, бұл айнымалыларды функцияның денесінде жариялаудың қажеті жоқ екенін ескеріңіз, өйткені олар функцияның қолтаңбасында жарияланған!
Басқару ағыны
Шартты операторлар
If(-else) операторлары go-да келесі синтаксиспен жүзеге асырылуы мүмкін:
if [оператор;] шарт {
блок-егер} [else if шарт {
блок-басқаша-егер}] [басқаша {
блок-басқаша}]
Қарапайым жағдайдан бастайық: қарапайым Шартты оператор.
негізгі пакет " FMT " импорттау айнымалы x бүтін = 8func main ()
{if x = 5 {
fmt.Println ("өтті")} }
Оңай, иә? Жақшалар қажет емес екенін ескеріңіз!
Тағы біраз жандандырайық:
негізгі пакет импорттау "фит" var foo Int = 4
var bar int = 3 func main () {
if baz: = foo + bar; baz 3 {
fmt.Println ("өте төмен")} else if baz 5 {
fmt.Println ("төмен")
} else if baz 7 {
fmt.Println ("орташа")} else {
fmt.Println ("жоғары")} }
Бірінші if BAZ операторындағы bas айнымалысын анықтайтын операторға назар аударыңыз: = foo + bar. Бұл айнымалының ауқымы if(-else) блогымен шектеледі.
2.3 Go циклдары
Go ішіндегі циклды келесі синтаксистің көмегімен жасауға болады:
for [инициализатор;] [шарт] [; жаңарту] {
цикл блогы}
Go цикліндегі жақшалар үшін қажет емес екенін ескеріңіз. Сонымен қатар, сіз инициализатордың да, жаңарту қадамының да міндетті емес екенін байқай аласыз, бұл сізге анықтауға мүмкіндік береді Форт циклы, тек Шартпен. Мұндай цикл әдетте белгілі whileцикл көптеген тілдерде. Дегенмен, Go мұны forcicl көмегімен жасауға мүмкіндік береді.
Кәдімгі форциклдің мысалын қарастырайық:
негізгі пакет "FMT"func main () импорттау {
res: = 1
base: = 2
exp: = 9
мен үшін: = 1; мен = ехр; i {{
res = res * base}
fmt.Println(res) }
Бұл мысалда біз дәрежеге көтерілуді жүзеге асырдық (мысал ретінде сіз math қолдана аласыз.Қажет болса, Pow).
Енді while мысалын қарастырайық (инициализатор жоқ және жаңарту қадамы жоқ):
негізгі пакет "FMT"func main () импорттау {
i: = 1
sum: = 0
for i 10 {
sum += i
i += 1}
fmt.Println(sum)}
Бұл цикл шартта 10-мен салыстырылатын өсіп келе жатқан I айнымалыны бақылайды және оны sum айнымалысына қосады. Нәтижесінде біз 1-ден 9-ға дейінгі бүтін сандардың қосындысын аламыз.
Соңғы ескерту: сіз сондай-ақ шартты елемей, шексіз цикл жасай аласыз.
2.4 Gin шеңбері
Gin-бұл Go-да жазылған веб-негіз . Оның httprouter арқасында өнімділігі 40 есе жоғары мартини тәрізді API бар . Егер сіз өнімділік пен жақсы өнімділікті қаласаңыз, сізге Gin ұнайды.
Go Модулінің қолдауымен келесі импортты қосыңыз
import "github.comgin-gonicgin"
сіздің кодыңызға, содан кейін go [buildruntest] автоматты түрде қажетті тәуелділіктерді алады.
Әйтпесе, диппакетті орнату үшін келесі Go пәрменін орындаңыз:
$ go get -u github.comgin-gonicgin
Жүгіру gin
Алдымен Gin пайдалану үшін Gin бумасын импорттау керек, қарапайым мысалдардың бірі келесі мысалға ұқсайды.go:
package main
import (
"nethttp"
"github.comgin-gonicgin")
func main () {
r: = gin.Default()
r.GET("ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",})
r.Run() listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}
Демонстрацияны бастау үшін Go пәрменін пайдаланыңыз:
# run example.go and visit 0.0.0.0:8080ping on browser
$ go run example.go
2.5 Pgx кітапханаларының жиынтығы
Pgx дербес пайдалануға болатын кітапханалар жиынтығын ұсынады. Төменде олардың кейбіреулері келтірілген:
pgconn: төмен деңгейлі PostgreSQL дерекқор драйвері.
pgxpool: pgx үшін байланыс пулы.
stdlib: database sqlpgx үшін үйлесімділік деңгейі.
pgtype: PostgreSQL 70-тен астам түрі үшін Go түрлерін енгізу.
Ағымдағы нұсқада (v4) go модуліне қолдау көрсетілетінін ескеріңіз. Толығырақ ақпаратты мына жерден табуға болады .
Біз адам туралы ақпаратты дерекқорымызда сақтап, оны алғымыз келеді. Мұның бәрі Біз мұнда жасауға тырысамыз.
Pgx-тен бастамас бұрын, PostgreSQL-ді сіздің даму ортаңызға қалай орнатуға және конфигурациялауға тез оралайық.
Сіз PostgreSQL-дің соңғы нұсқасын осы жерден жүктей аласыз . Амалдық жүйеге байланысты орнату опциясын таңдаңыз.
Ubuntu бар компьютерде келесі қадамдарды орындауға болады:
PostgreSQL және бірнеше қосымша модульдерді орнату үшін келесі пәрмендерді орындаңыз.
$ sudo сәйкес жаңарту обновление sudo apt орнату PostgreSQL PostgreSQL-contrib.
Орнату аяқталғаннан кейін дерекқорды келесі пәрменмен іске қосуға болады:
pg_ctlcluster 12 негізгіні іске қосу.
Әдепкі тіркелгіге кіру.
Келесі пәрменді пайдаланып әдепкі тіркелгіге (postgres) кіріңіз:
$ sudo-i-u постгресі
Бастапқыда құпия сөз әдепкі есептік жазбамен байланысты болмайды. Бастапқы жүйеге кіргеннен кейін құпия сөзді орнату ұсынылады. Мұны келесі SQL пәрменін қолдану арқылы жасауға болады.
ALTER USER postgres PASSWORD 'mypassword';
("Mypassword" сөзін қауіпсіз құпия сөзбен ауыстырыңыз.)
Ескерту. Өндірістік деңгей жүйесі үшін жеке дерекқорды (әдепкі Postgres дерекқорынан басқа) және пайдаланушыларды жасаған дұрыс. Қарапайымдылық үшін біз жоғарыда сипатталған орнатуды жалғастырамыз.
Енді біздің PostgreSQL қондырғысы пайдалануға дайын. Жобамызды дамыту үшін кесте үлгілерін жасауды бастайық.
Әдепкі есептік жазба public деп аталатын стандартты схемамен бірге келеді. Әзірге оны қолданайық.
Жоғарыда айтылғандай, біз кестеде адамдар туралы ақпаратты сақтауды жоспарлап отырмыз.
Жеке кестеде келесі өрістер болуы керек:
2.1 сурет - Тұлғалар кестесінің құрылымы
Біз келесі SQL сценарийін пайдаланып Person кестесін жасай аламыз.
Кесте атауының алдында public префиксін қосу қажет болмауы мүмкін, себебі ол әдепкі бойынша қолданылады. Дегенмен, ниетті нақты айту үшін бұл әдетті сақтау ұсынылады. Бұл басқа арнайы схеманы пайдалану кезінде дәйектілікті сақтауға көмектеседі.
2.2 сурет - Жеке кестедегі деректер
Енді кіріс идентификаторына негізделген адам туралы мәліметтер алу үшін қарапайым дерекқор функциясын құрайық. Функцияны құру үшін келесі SQL кодын қолдана аламыз.
Енді біз функцияны келесідей қолданамыз:
бөлісуден * таңдаңыз. get_person_details (1);
Орындағаннан кейін біз келесі нәтижеге қол жеткіземіз.
2.3 сурет - Функцияның нәтижесі
Бұл біздің дерекқорды кодтауды аяқтайды. Фокусты go қабатына жылжытыңыз.
2.6 Go жобасын құру
Go жобасын жасап, оны go-postgresql-pgx-example деп атайық.
Келесі пәрменді орындау арқылы модульді инициализациялаңыз:
$ go mod init go-postgresql-pgx-example
Pg және pg бассейнін орнатыңыз
Енді біз pgx және pgpool орнатуымыз керек.
$ өтіңіз github.comjackcpgxv4 $
өтіңіз github.comjackcpgxv4pgxpool
Дерекқорға қосылу үшін біз pgx немесе pgpool қолдана аламыз. Біздің мысал үшін біз байланыс пулын жасаймыз. Төменде бұл үшін go кодының мысалы келтірілген.
Енді қарапайым select операторына қоңырау шалу үшін кодты қосайық. Мұны келесідей жасауға болады:
Функцияны орындау;
ДҚ функциясын шақыру үшін кодты да қосайық. Бұл шамалы айырмашылықтары бар сұранысты орындау сияқты.
Енді біз go бағдарламасын орындаған кезде, біз 2.4-суретте көрсетілген мәліметтер базасынан деректерді аламыз.
2.4 сурет - Бағдарламаның нәтижесі
3 Практикалық бөлімі
3.1 Қолданылатын бағдарламалық жасақтамалар
Дипломдық жұмысынң тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Біріншіден, біз REPL-ді (оқу, бағалау, басып шығару , цикл) gin түрінде қолданамыз, бұл сіздің go қосымшаңызды кодтық базадағы кез-келген өзгерістермен қайта құрастыратын тірі құрастыру серверінің құралы.
Бізге пакеттік тәуелділік менеджері де қажет болады, ол үшін мен GoDep-ті қолданамын. Godep сонымен қатар жасау үшін жеткілікті ақылды vendorsкаталог және үшінші тарап бумаларын осы қалтаға жүктеңіз, егер сіз қолданбаны контейнерлегіңіз келсе, бұл қажет.
Жарайды, енді орта сұрыпталғаннан кейін, қалта құрылымы туралы сөйлесейік.
Бұл көптеген қалталар, мен олардың көпшілігін қарастырамын, бірақ қазір назар аудару керек ең маңызды қалталар:
үлгілер - біздің html сақтау үшін;
контроллерлер-біздің контроллерлерді сақтауға арналған;
модельдер-біздің деректер модельдерін сақтау үшін;
орташа. біздің қосымшаның бастапқы нүктесіне барады.
Ақырында, оның кодтық уақыты уақытты жоғалтпай, қоршаған ортаға енуге мүмкіндік береді.
негізгі пакет импорты (
"журнал" "орта маршрутизаторлар"жүйесі
жергілікті"github.comurfavenegron i" үшінші тұлға
) main () функциясы {
маршрутизатор: = маршрутизаторлар. Маршрутизаторды алыңыз ()
n: = негрони. Классикалық ()
n. реттелетін өңдеуші (маршрутизатор)
журнал. Println ("Тыңдау:")
N. орындау (":3001")}
3.1 сурет - Қалта ағашының құрылымы
Қалта ағашының құрылымы (сурет 3.1) - біз барлық қол жетімді қалталарды қарап, оңай пайдалану үшін сұрыптай аламыз.
Импортқа қарап, импортқа тапсырыс беру басқалардың түсінуі үшін өте пайдалы. Мұнда біз Go nethttp-мен тікелей жұмыс істейтін Negroni , шағын аралық бағдарламалық жасақтама кітапханасын қолданамыз. n. Run(":3001") біздің localhost:3001 қосымшасын іске қосады, өйткені біз gin-ді қолданамыз, біздің қосымшалар каталогынан gin --port:3000 іске қосайық, бұл біздің нақты уақыттағы қайта жүктеу серверіне арналған прокси-серверді іске қосады. Енді біздің веб-қосымшамызға 3000 немесе 3001 порттарынан кіруге болады. Әрине, Джиннің барлық мәні-оны 3000-мен пайдалану. Джинді қолдана отырып, мен өзгертулер енгізген сайын жобаны іске қосудықұрастыруды өткізіп жібере аламын.
3.2 сурет - Терминал терезесі
Ұсынылған терезе (сурет 3.2) кодты жазу кезінде жұмысты жеңілдетеді, егер пайдаланушы қате жіберсе, онда қатені өзі іздеудің қажеті жоқ, бағдарлама мұны өзі жасайды.
Біздің кодта қате болған кезде, содан кейін ол болмаған кезде терминал терезесі.
Енді маршрутизатордың айнымалысы қандай? Жақсы сұрақ, маршрутизаторға тереңірек үңілейік.go.
пакеттік маршрутизаторлар импорттау (
"желі http ""қоршаған ортаконтроллерлер"
"ортааралық бағдарлама"
"сәрсенбі URL""github.comgorillapat"
"github.comurfavenegroni"
) қосымшаның барлық бағыттарын тіркейді.
func GetRouter () *pat. Router {
URL пакетінен импортталған путиl жолдары
url_patterns: = urls. ReturnURLS ()
medium: = pat. New ()
medium. Get (url_patterns. HOME_PATH, controllers.HomeController)
common: = pat. New ()
статикалық маршрут
common. PathPrefix (url_patterns. STATIC_PATH). Handler (
http. StripPrefix (url_patterns. STATIC_PATH, http.FileServer(http.Dir("static")) ))
аралық бағдарламалық жасақтаманы қолдану
common. PathPrefix (url_patterns. MEDIUM_PATH).Handler(
negroni. New (
negroni. HandlerFunc (
middlewares. LoggingMiddleware),
negroni. Wrap (medium),
common. Get (url_patterns.LOGIN_PATH, controllers. LoginController)
common. Post (url_patterns.LOGIN_PATH, controllers. LoginController)
return common}
Жарайды, бұл файлда көп нәрсе болып жатыр, url_patterns айнымалысы URLs пакетінен қайтарылған мәндерді қамтиды.
URL пакетатип (
URL құрылымы {
STATIC_PATH жол
LOGIN_PATH жол
HOME_PATH жол
MEDIUM_PATH жол}
) func ReturnURLS () urls {
var url_patterns
url_patterns. STATIC_PATH = "static"
url_patterns.LOGIN_PATH = ""
url_patterns. MEDIUM_PATH = "medium"
url_patterns. HOME_PATH = url_patterns. MEDIUM_PATH + "home"
return url_patterns}
Бұл urls бума, мұнда біз қолданбамызға қол жеткізгіміз келетін барлық URL мекенжайларын анықтаймыз, мұнда анықталған URL мекенжайлары routers, controllers, templates бумаларында пайдаланылады. Осылайша, бізде URL мекенжайларын қолданбада басқаруғаөңдеуге болатын бір файл бар. Қолданбаға қосқымыз келетін кез-келген URL мекен-жайы осында жасалуы керек.
Маршрутизаторларға оралуы, барлық URL мекенжайларын алғаннан кейін біз контроллерлермен байланысты маршруттар жасай бастаймыз.
common: = pat. New ()
common. Get (url_patterns.LOGIN_PATH, controllers. LoginController)
common. Post (url_patterns.LOGIN_PATH, controllers. LoginController)
Мұнда жалпы болып табылады Pat нысаны, patбұл URL сұрауларын салыстыру үшін сорғыштың астындағы тұрақты өрнекті пайдаланатын маршрутизатор және сұрау менеджері.
Патчты орнату үшін go get https:github.comgorillapat
Әзірге біз бірнеше бумаларды орнаттық, Godep бумаларын файлға сақтайық, мұны godep save түймесін басу арқылы жасай аламыз, бұл көптеген нәрселерді жасайды, біріншіден, ол жасайды Godeps қолданбада қажет барлық бумаларды, соның ішінде бума нұсқаларын қамтитын JSON файлы бар каталог. Қандай жағдайда біз пакеттерді жоғалтамыз $gorootнемесе G gopathбіз JSON көмегімен оңай қалпына келтіре аламыз godep қалпына келтіру, ыңғайлы.
Қалай болғанда да , patу, қабылдау, жіберу, орнату, түзету, жою сияқты барлық негізгі http әдістері бар. Мен бұл демонстрация үшін тек get және post пайдалануды шештім.
common. Get (url_patterns.LOGIN_PATH, контроллерлер. LoginController)
Көріп отырғаныңыздай, әр бағыт келесідей болады, яғни.
маршрутизатор нысаны. http әдісі (шаблl үлгісі, сұрау жіберілетін контроллер)
Қолданбаға қосқыңыз келетін кез келген бағыт осы жерде орындалуы керек. Ол үшін бізге URL және контроллер қажет.
Мен маршрутизаторда сөйлескім келетін тағы бір нәрсе. контроллерлерге өтпес бұрын, бұл келесі екі жазба:
статикалық маршрут
common. PathPrefix (url_patterns. STATIC_PATH). Handler (
http. StripPrefix (url_patterns. STATIC_PATH, http. FileServer (http. Dir("static"))))
Бұл маршрут JS, CSS және кескіндер сияқты статикалық файлдарға қызмет көрсету үшін қолданылады.
Бұл маршрут негізінен "статикалық" префиксінен басталатын URL мекен-жайы бар кез-келген сұрау оның каталогтан файл іздейтінін білдіреді дейді. Статикалық, тікелей қызмет көрсетіледі.
аралық қабат бойынша қолдану
common. PathPrefix (url_patterns. MEDIUM_PATH). Handler (
negroni. New (
negroni. HandlerFunc (
middlewares. LoggingMiddleware),
negroni. Wrap(medium),
Егер біздің веб-серверге келген әрбір сұраныс қандай да бір өңдеуден өтуі керек болса ше? Мұнда negroni аралық бағдарламалары пайда болады. Мұнда біз URL мекен-жайы бар кез-келген сұраныс басталады деп айтамыз, орташа, loggingmiddleware жіберуі керекбірінші.
Middlewares-ті қарастырайық. go,
Пакеттің аралық қабаты бойынша импорт (
"fmt"
"nethttp"
"os"
"жолдар"
"уақыт"
) func LoggingMiddleware (res http. ResponseWriter, req *http. Request, next http. HandlerFunc) {
Сұрау туралы ақпаратты, яғни тақырыптарды, пайдаланушы агентін және т. б. журнал файлына жазу логикасы.
келесі (кесу, талап)}
Мен нақты іске асыруды жойдым, өйткені бұл жерде біз талқылағымыз келетін нәрсе емес. Мақаланың төменгі жағындағы бүкіл репозиторийге сілтеме.
Қабылдайды Loggingmiddleware, сұрау және жауап нысандары дәлел ретінде, содан кейін кез келген тапсырма аяқталғаннан кейін контроллерге бағыттау үшін бірдей нысандарды пайдаланады.
Контроллерлер, осылай
Маршрутизатордағы әрбір жазба файл контроллердегі контроллермен салыстырылады controllers пакетте.
пакет контроллеріимпорт (
"журнал"
"желіhttp"
"уақыт ""сәрсенбі көмекшілер"
"орта модельдер"
"сәрсенбі дүкен"
"қоршаған орташаблондар"
"сәрсенбі IRS"
"қоршаған ортаутилиталар" "github.comgorillaсхема"
) func LoginController (res http. ResponseWriter, req *http. Request) {
data: = make(map[string]interface {})
controller Template: = templates.LOGIN
url_patterns: = urls. ReturnURLS ()
if req. Method == "GET " {
utils. CustomTemplateExecute (res, req, controllerTemplate, data) }
if req. Method == "POST" {
err: = req. ParseForm ()
user: = new (models. User)
decoder: = schema. NewDecoder ()
err = decoder. Decode (user, req. Form)
if err! = nil {
utils. CustomTemplateExecute (res, req, controllerTemplate, data)
} else {
session, _: = utils. GetValidSession(req)
session. Мәндер ["бүркеншік ат"] = көмекшілер. StripWhiteSpaces(req.Форма ["Бүркеншік Ат"][0])
session. Save (req, res)
http. Redirect (res, req, url_patterns. HOME_PATH, http. StatusSeeOther)}
Контроллер жауап пен сұрау нысанын қабылдайды.
Data айнымалысы-кез-келген интерфейс мәнін қамтитын Жол кілттерінің картасы. Бұл туралы аздап сөйлесейік. HTML файлының жолын қамтитын пакеттің templates ішінен controllerTemplateconst жолы. url_patterns URLs пакетінен URL мекенжайларын қамтиды.
Міне, templates.html жолдары бар қосымша файл,
пакет шаблондарыconst BASE string = " templates base.html"
const HOME string = "templateshome.html"
const LOGIN string = "templateslogin.html"
const POSTS string = "templatesposts.html"
const POST_ADD string = "templates post_add.html"
const POST_VIEW string = "templatespost_view.html"
Енді әрбір контроллер get және post болып бөлінеді, Logincontroller-де utils сұраныстарын өңдеуші. Customtemplateexecute utils пакетінен. Қолданбаға қосылатын кез-келген шаблон осы жерде жасалуы керек.
Utils пакетіқолданбадағы кез-келген жалпы функцияны қамтиды, бұл бағдарлама ағынына көмектеседі.
Міне, utils қосымша файл,
пакеттік утилиталаримпорт (
"nethttp"
"жолдар"
"мәтін үлгі ""қоршаған ортамодельдер"
"қоршаған орташаблондар"
"сәрсенбі IRS""github.comgorillasessions"
) func CustomTemplateExecute (res http. ResponseWriter, req *http. Request, templateName string, data map[string]interface {}) {
Жалпы шаблондар мен ... жалғасы
Тема дипломной работы - Разработка Web-приложения с использованием системы защиты.
Цель работы - Разработка Web-приложения с использованием системы защиты с использованием языка программирования Golang.
При создании программы использовался язык программирования Golang, с актуальным и новейшим набором библиотек. При работе программа должна выполнять функцию передачи SSH ключей.
Произведен процесс расчетов окупаемости, расходов и доход от создаваемого продукта. Учтены нынешние цены на электроэнергию, закупаемые товары.
Рассмотрена работа с точки зрения безопасности помещения, где происходит процесс разработки программного продукта.
Аңдатпа
Дипломдық жұмысынң тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Жұмыстың мақсаты - Golang бағдарламалау тілін қолдана отырып, қорғаныс жүйесін қолдана отырып, Web қосымшасын жасау.
Бағдарламаны құру кезінде кітапханалардың өзекті және соңғы жиынтығы бар Golang бағдарламалау тілі қолданылды. Жұмыс кезінде бағдарлама SSH кілттерін беру функциясын орындауы керек.
Өндірілген өнімнің өтелуін, шығыстарын және кірісін есептеу процесі жүргізілді. Электр энергиясының, сатып алынатын тауарлардың қазіргі бағасы ескерілді.
Жұмыс бағдарламалық өнімді әзірлеу процесі жүретін бөлменің қауіпсіздігі тұрғысынан қарастырылады.
Annotation
The topic of the thesis is the Development of a Web application using a security system.
The purpose of the work is the development of a Web application using a security system using the Golang programming language.
When creating the program, the Golang programming language was used, with an up-to-date and newest set of libraries. When working, the program must perform the function of transferring SSH keys.
The process of calculating the payback, expenses and income from the created product has been carried out. Current electricity prices and purchased goods are taken into account.
The work is considered from the point of view of the security of the room where the process of developing a software product takes place.
Мазмұндама
1 Веб-серверді қорғау 8
1.1 Веб-сервер мен қолданба серверін қорғау жолдары 8
1.2 SSH кілттерін құру 9
2 Golang бағдарламалау тілі 12
2.1 Golang туралы түсінік 12
2.2 Бағдарламалау тілінің негіздері 13
2.3 Go циклдары 17
2.4 Gin шеңбері 18
2.5 Pgx кітапханаларының жиынтығы 18
2.6 Go жобасын құру 20
3 Практикалық бөлімі 22
3.1 Қолданылатын бағдарламалық жасақтамалар 22
3.2 Жобаға арналған программаны әзірлеу 33
3.3 Шабуыл процессі 37
4 Тіршілік қауіпсіздігі 41
4.1 Инженердің жұмыс жағдайын талдау 41
4.2 Кондиционерлеу және ауаны жаңарту жүйелерін есептеу 45
4.3 Тіршілік қауіпсіздігі бөлімінің қорытындысы 51
5 Технико - экономикалық негізделуі 52
5.1 Жұмыс туралы ақпарат және қажеттілігін негіздеу 52
5.2 Бағдарламалық қамтаманың өңделуінің еңбек өнімділігінің есептелуі 52
5.3 Бағдарламалық қамтаманы өңдеуге кеткен шығынның есептелуі 54
5.4 Қосымша шығындар статьясы 55
5.6 Бағдарламалық өнімді иемденудегі кәсіпорындардың бірмезгілдегі шығындарын есептеу 59
5.7 Таза ағымдағы құндылықты есептеу 60
5.8 Экономика бөлімінің қорытындысы 61
Қорытынды 62
Әдебиет тізімі 63
Қосымша А 65
Кіріспе
Дипломдық жобаның тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Дипломдық жобасының есептері:
1) SSH кілттері туралы мәліметтерді алу;
2) Бағдарламалау тілін қолдану арқылы бағдарламаны құру қасиеттерін зерттеу;
3) Golang бағдарламалау тілі арқылы ақпаратты қорғау жүйесін әзірлеу;
4) Тіршілік қауіпсіздігі бөлімі үшін есептеулер жүргізуге;
5) Экономика бөлімінде дипломдық жобаның есебін жүргізу.
Дипломдық жобаның ғылыми жаңалықтары: Go жабдықтау тілін қолдана Web қосымшасын әзірлеу.
Дипломдық жобаның өзектілігі - - Go жабдықтау тілін қолдана отырып қарастыру.
Дипломдық жобаның зерттелу дәрежесі - диплмодық жоба толығымен зерттелді және іске асыруға дайын.
Дипломдық жобаға қолданатын әдебиет көздерін талдау - дипломдық жобада пайдаланылатын әдебиеттер интернет ресурстарынан, АЭжБУ университетінің кітапханасынан, сондай-ақ Абылай хан көшесіндегі Ұлттық кітапханадан алынды.
Дипломдық жобаны талдау нысандары - дипломдық жобаны талдау формалары-оларға Go жбадықтау тілі туралы ақпарат, кестелер және бағдарламалық өнімнің скриншоттары кіреді.
Веб - қосымшалардың қауіпсіздігі 10 жылдан астам уақыт бойы ақпараттық қауіпсіздіктің негізгі тенденциялары мен қауіптерінің ондығына кірді. Шынында да, қазіргі заманғы бизнес-процестер мен күнделікті өмір веб-қосымшаларды әр түрлі аспектілерде қолдануға байланысты: күрделі инфрақұрылымдық жүйелерден IoT құрылғыларына дейін. Дегенмен, веб-қосымшаларды қорғауға арналған арнайы құралдар өте аз және көбінесе бұл тапсырма әзірлеушілерге жүктеледі (немесе ол шешіледі деп үміттенеді). Бұл әртүрлі құрылымдарды, санитарияны, деректерді тазалауды, қалыпқа келтіруді және т. б. Алайда, бұл құралдарды қолданған кезде де интернет қауіпсіз бола алмады, сонымен қатар "классикалық желінің" барлық осалдықтары мобильді дамуға көшті. Бұл мақалада осалдықты қалай болдырмауға болатындығы туралы емес, веб-қосымшаны веб-қосымшаның брандмауэрі арқылы оны пайдаланудан қалай қорғауға болатындығы туралы айтылады.
Веб-сервердің дұрыс конфигурациясынан сайтты қажетсіз файлдар мен Код бөлімдерінен тазарту және минималды бақылау. Шынында да, арналар әлсіз болды, DDoS таралмады, осалдықтар аз болды, қосымшалар қарапайым болды және қолданушылардың әрекеттері бірнеше сценарийлермен болжалды.
Уақыт өте келе веб-қосымшалар, серверлік инфрақұрылым және өзара әрекеттесу күрделене түсті, ал код "шабуыл беті"болып табылады. Интернет өте танымал болды, қаржылық өсу мүмкіндіктері пайда болды-бұл, әрине, осы салада басқа біреудің жұмысын заңсыз пайдаланғысы келетіндерді қызықтырды.
Веб-қосымшаларға жасалған шабуылдардың саны мен әртүрлілігі экспоненциалды түрде өсе бастады, оларды шартты түрде екі санатқа бөлуге болады (ақпараттық қауіпсіздік тұжырымдамасына негізделген):
ақпараттың құпиялылығын бұзуға бағытталған қауіптер;
ақпараттың қолжетімділігін бұзуға бағытталған қауіптер.
Біріншіден, бұл осалдықтарды пайдалануға, екіншіден, қызмет көрсетуден бас тартуға қатысты. Егер қосымшаны жоспарлау және әзірлеу кезеңінде кейбір шабуылдардан аулақ болуға тырысу мүмкін болса. Веб-қосымшаны интернетте орналастырған кезде сайт (әсіресе танымал қызмет саласы немесе компания) барлық бағытта шабуыл жасай бастайды:
осалдықтарды пайдаланудың автоматтандырылған жүйелері;
кәсіби киберқылмыскерлер;
жаңадан келгендер, әуесқойлар.
Олардың әртүрлі әдістері, тәсілдері мен құралдары бар -- оларды біріктіретін бір мақсат - веб-қосымшаны бұзу немесе бұзу.
1 Веб-серверді қорғау
1.1 Веб-сервер мен қолданба серверін қорғау жолдары
Веб-сервер мен қолданбалы серверді қорғау-бұл веб-трафикті, жергілікті кәсіпорын желісін және онда сақталған ақпаратты қорғау мақсатында осы серверлерге бағытталған қауіптерді жою шараларының жиынтығы.
Веб-сервер-бұл HTTP сұрауларына қызмет көрсететін сервер. Оның басты міндеті-сайттың статикалық мазмұнын көрсету. Сонымен қатар, ол веб-беттердің жұмысын автоматтандырады, пайдаланушыларға рұқсат береді және аутентификациялайды, пайдаланушы сұрауларының журналын жүргізеді, қауіпсіз HTTPS қосылымдарын қолдайды. Мұндай веб-сервер статикалық деп те аталады. Ол қолданба серверінсіз бөлек жұмыс істей алады.
Статикалық веб-сервер қолданба серверімен және дерекқормен бірге жұмыс істегенде, ол динамикалық мазмұн сұрауларын қолданба серверіне жібереді. Бұл жағдайда оны динамикалық деп атайды.
Қолданба сервері-бұл HTTP және HTTPS-пен ғана емес, басқа протоколдармен де жұмыс істейтін құрылым (бағдарламалық платформа). Ол пайдаланушылардың динамикалық және статикалық мазмұнмен өзара әрекеттесуін қамтамасыз етеді.
Веб - сервер мен қосымшалар сервері Бағдарламалық жасақтамаға енуден, трафикті ұстап қалудан және маңызды ақпаратқа рұқсатсыз қол жеткізуден қорғауды қажет етеді.
Веб-серверді ақпараттық қорғау жөніндегі іс-шараларды жүзеге асырар алдында сервер жұмысының жүйелеріне аудит (талдау) жүргізу қажет. Бұл қауіптің түрін және қауіпсіздікті қамтамасыз ету әдістерін анықтауға көмектеседі.
Қауіптің негізгі түрлері:
операциялық жүйеге хакерлік шабуыл және бағдарламалық жасақтаманы қамтамасыз ететін файлдарды өзгерту;
трафикке рұқсатсыз қол жеткізу және оны ұстап алу;
Серверге DDoS шабуылдары;
бұзылу немесе оның істен шығуы нәтижесінде серверлік жабдықтың жұмысындағы қателер;
веб-серверге қызмет көрсетудегі қателер сияқты адам факторы;
веб-серверді қасақана бұзу және оны пайдалану кезінде қателіктер жіберу.
Веб-сервер мен қолданба серверін қорғаудың мақсаты оларға рұқсатсыз кіруді болдырмау болып табылады. Ол үшін серверлердегі ақпаратқа қол жеткізу құқықтарының аражігін ажырату жүргізіледі. Трафикті қорғауды қамтамасыз ету үшін ақпаратты шифрлау және оны қорғалған байланыс арналары арқылы беру әдістері қолданылады.
Қауіпсіздік үшін қолданба сервері қолданбалардың брандмауэрін (Web application firewall немесе қысқаша WAF) пайдаланады. Бұл қолданбалы деңгейде жұмыс істейтін мониторлар мен сүзгілер кешені. WAF кіріс және шығыс трафикті нақты уақыт режимінде талдау және шешім қабылдау үшін қолданба серверінің үстінде орналасқан қабылдамау немесе рұқсат беру.
1.2 SSH кілттерін құру
Ашық және жабық SSH кілттерінің жұбы-бұл криптографиямен жасалған арнайы кодтар. Олар сенімді пайдаланушыны анықтауға мүмкіндік береді және тиімділігі бойынша логиндер мен парольдерді құрудан асып түседі.
Бұл технологияда адам факторы, сондай-ақ есептеу технологияларының көмегімен парольді әдейі таңдау толығымен алынып тасталады. Теориялық тұрғыдан кілттердің тіркесімін шешуге болады, бірақ бұл ерекше жағдайларда жүзеге асырылуы мүмкін тым көп уақытты қажет ететін және ұзақ процесс.
Жүйе әкімшісі кез-келген операциялық жүйеде, соның ішінде ашық бастапқы Unix жүйелерінде SSH кілттерін теңшей алады.
Брандмауэрді орнату
Брандмауэрді желілік экран, брандмауэр немесе брандмауэр деп те атайды. Бұл веб-серверді ашық порттар мен трафик арқылы рұқсатсыз кіруден қорғайтын бағдарламалық құрал немесе Бағдарламалық құрал шешімі. Кіру корпоративтік қауіпсіздік саясатына сәйкес желі экранының параметрлерімен реттеледі.
Брандмауэр алдын ала аудит нәтижелеріне және қосымша қорғау әдістеріне қарамастан кез келген ақпараттық қауіпсіздік жүйесі үшін міндетті болып табылады.
VPN және Private Networking -- бұл серверлер мен пайдаланушылар арасында Қауіпсіз байланысы бар виртуалды жеке желіні және жеке желіні құру технологиясы.
Vpn және Private Networking компанияның қажеттіліктеріне сәйкес келеді. Жеке желінің бар екендігі туралы оның пайдаланушылары ғана біледі. Бұл сыртқы қауіптерді азайтуға мүмкіндік береді.
1.1 сурет - VPN жұмыс принципі
Веб-серверді қорғаудың стандартты әдістері оны DDoS шабуылдарынан қорғай алмайды.
Веб-Сервердің DDoS шабуылдарынан қауіпсіздігі үшін брандмауэр, iptables және ipset утилиталары және боттарды бұғаттауға арналған сценарийлер қажет.
PKI - және SSLTLS-шифрлау
Бұл пайдаланушыны сәйкестендіру сертификаттарын құру және шифрланған ақпаратты SSLTLS криптографиялық протоколы арқылы беру үшін ашық кілт инфрақұрылымын (PKI) құру.
1.2 сурет - SSH кілттері
Ол үшін қол жеткізу құқығын тексеру үшін сертификаттау және сертификаттарды басқару орталығы құрылады.
1.3 Оқшауланған ортаны құру
Бұл қосымшалар мен бағдарламалардың оқшауланған жұмыс ортасын құру, оларды бір-бірінен бөліп, өз серверлеріне бөлу. Оқшаулау дәрежесі әр бағдарламалық өнімнің жүйелік талаптарына және оның бүкіл АТ инфрақұрылымының жұмысындағы маңыздылық деңгейіне байланысты.
Осылайша, бағдарламалық жасақтама қауіп-қатерден және бір процеске рұқсатсыз қол жеткізудің бүкіл жүйесінің жұмысына әсер етуден оқшауланады.
Веб-сервер қандай амалдық жүйеде жұмыс істейтініне қарамастан, антивирустық бағдарламаларды орнатуды елемеу ұсынылмайды. Кез-келген файлды жұқтырған жағдайда, антивирустық бағдарлама вирустың бүкіл жүйені басып алуына жол бермейді.
Деректердің қолжетімділігін қамтамасыз ету
Веб-сервер мен қосымшалар серверін сыртқы қауіптерден қорғаудан басқа, ішкі қауіптерден де шаралар қолданылады: қызметкерлердің қателіктері, жабдықтың істен шығуы немесе бағдарламалық жасақтама. Шешімдер кешені деректерді қорғауға және техникалық құралдардың ақауларға төзімділігін қамтамасыз етуге бағытталған.
Веб-серверді қорғауды қамтамасыз етудің барлық сипатталған тәсілдерін бірге немесе бөлек жүзеге асыруға болады.
2 Golang бағдарламалау тілі
2.1 Golang туралы түсінік
Голанг Google-да әзірленген және оны Роберт Гриземер, Роб Пайк және кен Томпсон жасаған. Ол алғаш рет 2007 жылдың 21 қыркүйегінде талқыланды және ақырында 2009 жылдың 10 қарашасында Ашық бастапқы жоба болды.
Go веб-сайтында хабарланғандай, бұл тіл жұмыс істеу үшін бағдарламалау тілін таңдау кезінде тиімді құрастыру, тиімді орындау немесе бағдарламалаудың қарапайымдылығы арасындағы қажетті таңдаудың арқасында дүниеге келді. Осылайша, Go-ның негізгі мақсаты статикалық теру арқылы құрастырылған тілдің тиімділігі мен қауіпсіздігін сақтай отырып, түсіндірілетін және динамикалық терілген тілдің қарапайымдылығына қол жеткізетін тіл құру болды. Тағы бір басты мақсат-параллелизмді тілдің басымдықтарының біріне айналдыру арқылы көп ядролы процессорлардың өсуінің артықшылықтарын пайдалану .
Go мақсаттарын тереңірек түсіну үшін мен Роб Пайк жазған осы мақаланы оқуды ұсынамын. Осы мақалада айтылған кейбір мақсаттар шешімін табуды қамтиды:
баяу құрастырулар;
бақыланбайтын тәуелділіктер;
әр бағдарламашы тілдің әр түрлі ішкі жиынтығын қолданады;
бағдарламаны нашар түсіну (кодты оқу қиын, нашар құжатталған және т. б.);
күш-жігерді қайталау;
жаңарту құны;
нұсқаның қисаюы;
Автоматты құралдарды жазудың қиындығы;
кросс-тілдік құрылымдар.
Google үлкен кодтық базалары бар ауқымды жүйелермен жұмыс істейтінін ескере отырып, Go ең алдымен үлкен жүйелердегі ең көп кездесетін мәселелерді шешуге тырысатын "бағдарламалық жасақтама қызметінде" тіл ретінде дамыды.
Жұмыс
Сәлем Әлем!
Ал, бәрі туралы! Go-да алғашқы бағдарламамызды жазуды бастайық. Келесі бөлімдерде мен бағдарламамыздың әр бөлігін толығырақ түсіндіремін. Біз "Сәлем әлемін" басып шығара аламыз!"кодтың келесі бірнеше жолдары бар хабарлама:
негізгі пакетимпорт
"фмт"func main() {
fmt.Println("Привет, мир!") }
Жоғарыда келтірілген фрагменттің алғашқы түсіндірмесін жасайық, осылайша біз алғашқы құрылыс блоктарын ала бастаймыз. Go бағдарламалары пакеттерде ұйымдастырылған және бір арнайы пакет орындалатын командаларда қолданылуы керек "негізгі" болып табылады. Енді біз бағдарламамызға пакеттерді қосуға мүмкіндік беретін импорттау операторына ауыса аламыз. Айта кету керек, біз келесі синтаксисі бар бірнеше пакетті импорттай аламыз:импорт
("пакет_1"
"пакет_2" )
Біздің мысалда біз "fmt" бумасын көреміз , ол әдетте стандартты кірістен оқу немесе стандартты шығысқа жазу үшін қолданылады. Біз бұл пакетті осы дипломдық жұмыс дамыған сайын егжей-тегжейлі зерттейтін боламыз.
Соңында, біз таба аламыз FUNC main() біздің Go бағдарламамыздың негізгі функциясын жариялайтын таңқаларлық емес хабарландыру.
2.2 Бағдарламалау тілінің негіздері
Go-статикалық терілген тіл. Бұл дегеніміз, динамикалық терілген тілдерден айырмашылығы (мысалы, JavaScript немесе Python), сіз бастапқыда айнымалы түрін жариялайсыз және оны ұстанасыз. Мысалы, егер сіз бүтін айнымалыны жарияласаңыз, ол өмірлік циклінің кейінгі кезеңінде жол бола алмайды. Неғұрлым егжей-тегжейлі және қатаң болғанымен, айнымалы түрі әрқашан бірдей екенін ескере отырып, компиляторға кодты оңтайландыруға көбірек мүмкіндік береді. Тілдерді статикалық және динамикалық терумен толығырақ салыстыру үшін осы мақаланы қараңыз.
Алғашқы айнымалыларымызды жариялайық. Ол үшін біз келесі синтаксисті қолдануымыз керек:
var аты түрі [=мәні]
Мен толтырғыш ретінде және арасындағы мәндерді қолданамын, ал квадрат жақшалар [] оператордың қосымша бөлігін білдіреді. Осылайша, келесі екі мәлімдеме де дұрыс болады:
Var i int
var J string = "Сәлем"
J айнымалысын "Сәлем" жолымен нақты инициализациялағанымызбен, бұл i айнымалысы да инициализацияланатынын ескеріңіз: тек жарияланған айнымалылар "нөлдік мәнмен" инициализацияланады, ол сандар үшін 0-ге, жолдар үшін "" және логикалық айнымалылар үшін жалған.
Сонымен қатар, келесі синтаксисі бар кодтың бір жолын пайдаланып, бір типтегі бірнеше айнымалыларды жариялауға (және қажет болған жағдайда инициализациялауға) болады:
var "ат_1", "ат_2 "" тип " [="мән_1", "мән_2"]
Біз бұл мүмкіндікті мысалмен суреттейміз:
айнымалы i, j Int = 12, 27
Алайда, голангтың мақсаты тиімді кодты құру ғана емес, сонымен қатар бағдарламалау процесін жеделдету болды. Сондықтан біз айнымалыны Walrus: = операторының көмегімен инициализациялай аламыз. Осы операторды қолдана отырып, синтаксис қысқа болады және айнымалының түрін нақты анықтаудың қажеті жоқ (Go мұны біз үшін шешеді, мысалы, типтің шығысы). Дегенмен, walrus операторын тек функция ішінде пайдалануға болатынын ескеру маңызды. Келесі мысал айнымалының декларациясы мен инициализациясының қаншалықты қарапайым болатынын көрсете алады:
к: = 42.0
Сонымен қатар, Go айнымалының көрінуін оның атына қарай анықтауға мүмкіндік береді. Егер сіздің айнымалыңыз кіші әріптен басталса, ол пакеттің ішінде қалады. Алайда, егер бірінші әріп бас әріппен жазылса, ол басқа пакеттерге көрінеді (немесе экспортталады).
Мен осы бөлімді келесі ескертулермен аяқтағым келеді:
барлық айнымалыларды пайдалану керек, әйтпесе Go компиляция уақытының қатесін қайтарады.
айнымалыны қайта жариялауға жол берілмейді (көлеңкеден басқа ).
жоғарыда келтірілген Walrus операторының мысалы float64 типті айнымалыны жасайды. Егер біз float32 жасағымыз келсе, толығырақ жарнаманы пайдалануымыз керек.
Сіз сондай-ақ рұқсат етілген деректер түрлерінің тізімін қарап шығуға қызығушылық танытуыңыз мүмкін .
Келесі синтаксисті қолдану арқылы мәнді басқа түрге түрлендіруге (немесе түрлендіруге) болады:
түрі(айнымалы)
Әрине, орнында келтіруге жол берілмейді, өйткені біз статикалық теру арқылы тілде жұмыс істейміз:
Var i int = 12
var j float32 = float32(i)
Енді бүтін санды жолға түрлендіруге тырысайық:
a: = 65
b: = жол (a)
fmt.Println(b)
Егер сіз жоғарыдағы кодтың 3 жолын іске қоссаңыз, ол біз күткендей "65" орнына "A" шығаратынын көресіз. Себебі бүтін санды жолға тікелей түрлендіру берілген санның юникод таңбасын қайтарады ("А" -- юникодтағы № 65 таңба).
Сонымен... бүтін санды жолға қалай түрлендіруге болады? Ол үшін бізге strconv пакеті қажет. Атап айтқанда, бұл жағдайда бізге Itoa функциясы қажет болады (ASCII ішіндегі бүтін) :
негізгі пакет импорты ("fmt"
"strconv"
) func main () {
a: = 65
b: = strconv.Itoa(a)
fmt.Printf("%v, %T\n", b, b) }
Егер сіз жоғарыдағы фрагментті іске қоссаңыз, b қазір "65"екенін көресіз.
Сондай-ақ, const кілт сөзін пайдаланып тұрақты мәндерді анықтауға болады:
тұрақты с = 123
Енді z айнымалысы 123 тұрақты мәнге ие болады және сіз оны өзгерте алмайсыз. Сондай-ақ, морж операторы тұрақтыларға қолданылмайтынын қосқым келеді.
Пікірлер орны
Кодта Түсініктеме жазу әріптестеріңізге (және болашақта өзіңізге) код үзіндісін түсіндіруге көмектеседі. Сіз келесі синтаксиспен бір жолды Түсініктеме жаза аласыз:
пікір
... немесе осыған ұқсас көп жолды пікірлер:
* пікір *
көрсеткіштер
Go мәннің жад мекенжайын қамтитын көрсеткіштермен жұмыс істеуге мүмкіндік береді. Көрсеткішті келесі синтаксиспен анықтай аламыз:
var көрсеткіш атауы * түрі
Мысал ретінде:
вар i * int
Біз сондай-ақ пайдалана аламыз &көрсетілген айнымалыға көрсеткішті қайтаратын оператор:
var көрсеткіш атауы * түрі = & айнымалы
Соңында, меңзердің мазмұнына * оператор арқылы қол жеткізе аламыз:
* көрсеткіш атауы
Қорытындылай келе, көрсеткіштермен қалай жұмыс істей алатынымызды қарастырайық:
Негізгі пакет импорттау " FMT " FUNC main () {
var i int = 27
var p *int = &i
fmt.Println(*p)
*p += 1
fmt.Println(i) }
Бұл мысалда біз 27 мәні бар бүтін IC айнымалысын, содан кейін оған сілтеме жасайтын p көрсеткішін жасадық. Содан кейін біз айнымалы мәнді көрсеткіш арқылы басып шығардық. Соңында, біз көрсеткіш арқылы айнымалы мәнін арттырдық және соңғы мәнді басып шығардық.
Біз келесі синтаксисті пайдаланып Go функциясын жасай аламыз:
func name([var_1 type_1, var_2 type_2]) [return_type] {}
Жоғарыда келтірілген псевдокод үзіндісінде мен мысал ретінде екі аргументті қостым, бірақ біз нөлдік немесе одан да көп аргументтердің функцияларын бере аламыз. Мысал көрейік:
функция көбейту (i Int, j int) int {
i * j қайтару }
Қайтару мәні функцияның қолтаңбасында жарияланған қайтару мәнімен бірдей екенін ескеріңіз. Енді біз бұл мүмкіндікті келесідей шақыра аламыз:
көбейту (3, 11)
Go екі (немесе одан да көп) дәйекті аргументтер бірдей типте болған кезденыйам синтаксисті ұсынады. Біз бұл айнымалылардың түрін оны соңғы деп жариялау арқылы жариялай аламыз:
функция көбейту (i, j Int) int {
i * j қайтару}
Жоғарыдағы мысалда екі Аргументтің де Int түрі бар.
Біз функцияларға бірнеше мәндерді қайтара аламыз:
func personal_info() (string, int) {
name: = "John"
age: = 27
return name, age}
... немесе аталған мәндерді қайтару ("жалаңаш қайтару" деп те аталады):
func ops (x, y float64) (mult, div float64) {
mult = x * y
div = x y
return}
Бұл жағдайда біз айнымалыларды қайтару мәлімдемесінде көрсетудің қажеті жоқ, өйткені олар функцияның қолтаңбасында көрсетілген. Сонымен қатар, бұл айнымалыларды функцияның денесінде жариялаудың қажеті жоқ екенін ескеріңіз, өйткені олар функцияның қолтаңбасында жарияланған!
Басқару ағыны
Шартты операторлар
If(-else) операторлары go-да келесі синтаксиспен жүзеге асырылуы мүмкін:
if [оператор;] шарт {
блок-егер} [else if шарт {
блок-басқаша-егер}] [басқаша {
блок-басқаша}]
Қарапайым жағдайдан бастайық: қарапайым Шартты оператор.
негізгі пакет " FMT " импорттау айнымалы x бүтін = 8func main ()
{if x = 5 {
fmt.Println ("өтті")} }
Оңай, иә? Жақшалар қажет емес екенін ескеріңіз!
Тағы біраз жандандырайық:
негізгі пакет импорттау "фит" var foo Int = 4
var bar int = 3 func main () {
if baz: = foo + bar; baz 3 {
fmt.Println ("өте төмен")} else if baz 5 {
fmt.Println ("төмен")
} else if baz 7 {
fmt.Println ("орташа")} else {
fmt.Println ("жоғары")} }
Бірінші if BAZ операторындағы bas айнымалысын анықтайтын операторға назар аударыңыз: = foo + bar. Бұл айнымалының ауқымы if(-else) блогымен шектеледі.
2.3 Go циклдары
Go ішіндегі циклды келесі синтаксистің көмегімен жасауға болады:
for [инициализатор;] [шарт] [; жаңарту] {
цикл блогы}
Go цикліндегі жақшалар үшін қажет емес екенін ескеріңіз. Сонымен қатар, сіз инициализатордың да, жаңарту қадамының да міндетті емес екенін байқай аласыз, бұл сізге анықтауға мүмкіндік береді Форт циклы, тек Шартпен. Мұндай цикл әдетте белгілі whileцикл көптеген тілдерде. Дегенмен, Go мұны forcicl көмегімен жасауға мүмкіндік береді.
Кәдімгі форциклдің мысалын қарастырайық:
негізгі пакет "FMT"func main () импорттау {
res: = 1
base: = 2
exp: = 9
мен үшін: = 1; мен = ехр; i {{
res = res * base}
fmt.Println(res) }
Бұл мысалда біз дәрежеге көтерілуді жүзеге асырдық (мысал ретінде сіз math қолдана аласыз.Қажет болса, Pow).
Енді while мысалын қарастырайық (инициализатор жоқ және жаңарту қадамы жоқ):
негізгі пакет "FMT"func main () импорттау {
i: = 1
sum: = 0
for i 10 {
sum += i
i += 1}
fmt.Println(sum)}
Бұл цикл шартта 10-мен салыстырылатын өсіп келе жатқан I айнымалыны бақылайды және оны sum айнымалысына қосады. Нәтижесінде біз 1-ден 9-ға дейінгі бүтін сандардың қосындысын аламыз.
Соңғы ескерту: сіз сондай-ақ шартты елемей, шексіз цикл жасай аласыз.
2.4 Gin шеңбері
Gin-бұл Go-да жазылған веб-негіз . Оның httprouter арқасында өнімділігі 40 есе жоғары мартини тәрізді API бар . Егер сіз өнімділік пен жақсы өнімділікті қаласаңыз, сізге Gin ұнайды.
Go Модулінің қолдауымен келесі импортты қосыңыз
import "github.comgin-gonicgin"
сіздің кодыңызға, содан кейін go [buildruntest] автоматты түрде қажетті тәуелділіктерді алады.
Әйтпесе, диппакетті орнату үшін келесі Go пәрменін орындаңыз:
$ go get -u github.comgin-gonicgin
Жүгіру gin
Алдымен Gin пайдалану үшін Gin бумасын импорттау керек, қарапайым мысалдардың бірі келесі мысалға ұқсайды.go:
package main
import (
"nethttp"
"github.comgin-gonicgin")
func main () {
r: = gin.Default()
r.GET("ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",})
r.Run() listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}
Демонстрацияны бастау үшін Go пәрменін пайдаланыңыз:
# run example.go and visit 0.0.0.0:8080ping on browser
$ go run example.go
2.5 Pgx кітапханаларының жиынтығы
Pgx дербес пайдалануға болатын кітапханалар жиынтығын ұсынады. Төменде олардың кейбіреулері келтірілген:
pgconn: төмен деңгейлі PostgreSQL дерекқор драйвері.
pgxpool: pgx үшін байланыс пулы.
stdlib: database sqlpgx үшін үйлесімділік деңгейі.
pgtype: PostgreSQL 70-тен астам түрі үшін Go түрлерін енгізу.
Ағымдағы нұсқада (v4) go модуліне қолдау көрсетілетінін ескеріңіз. Толығырақ ақпаратты мына жерден табуға болады .
Біз адам туралы ақпаратты дерекқорымызда сақтап, оны алғымыз келеді. Мұның бәрі Біз мұнда жасауға тырысамыз.
Pgx-тен бастамас бұрын, PostgreSQL-ді сіздің даму ортаңызға қалай орнатуға және конфигурациялауға тез оралайық.
Сіз PostgreSQL-дің соңғы нұсқасын осы жерден жүктей аласыз . Амалдық жүйеге байланысты орнату опциясын таңдаңыз.
Ubuntu бар компьютерде келесі қадамдарды орындауға болады:
PostgreSQL және бірнеше қосымша модульдерді орнату үшін келесі пәрмендерді орындаңыз.
$ sudo сәйкес жаңарту обновление sudo apt орнату PostgreSQL PostgreSQL-contrib.
Орнату аяқталғаннан кейін дерекқорды келесі пәрменмен іске қосуға болады:
pg_ctlcluster 12 негізгіні іске қосу.
Әдепкі тіркелгіге кіру.
Келесі пәрменді пайдаланып әдепкі тіркелгіге (postgres) кіріңіз:
$ sudo-i-u постгресі
Бастапқыда құпия сөз әдепкі есептік жазбамен байланысты болмайды. Бастапқы жүйеге кіргеннен кейін құпия сөзді орнату ұсынылады. Мұны келесі SQL пәрменін қолдану арқылы жасауға болады.
ALTER USER postgres PASSWORD 'mypassword';
("Mypassword" сөзін қауіпсіз құпия сөзбен ауыстырыңыз.)
Ескерту. Өндірістік деңгей жүйесі үшін жеке дерекқорды (әдепкі Postgres дерекқорынан басқа) және пайдаланушыларды жасаған дұрыс. Қарапайымдылық үшін біз жоғарыда сипатталған орнатуды жалғастырамыз.
Енді біздің PostgreSQL қондырғысы пайдалануға дайын. Жобамызды дамыту үшін кесте үлгілерін жасауды бастайық.
Әдепкі есептік жазба public деп аталатын стандартты схемамен бірге келеді. Әзірге оны қолданайық.
Жоғарыда айтылғандай, біз кестеде адамдар туралы ақпаратты сақтауды жоспарлап отырмыз.
Жеке кестеде келесі өрістер болуы керек:
2.1 сурет - Тұлғалар кестесінің құрылымы
Біз келесі SQL сценарийін пайдаланып Person кестесін жасай аламыз.
Кесте атауының алдында public префиксін қосу қажет болмауы мүмкін, себебі ол әдепкі бойынша қолданылады. Дегенмен, ниетті нақты айту үшін бұл әдетті сақтау ұсынылады. Бұл басқа арнайы схеманы пайдалану кезінде дәйектілікті сақтауға көмектеседі.
2.2 сурет - Жеке кестедегі деректер
Енді кіріс идентификаторына негізделген адам туралы мәліметтер алу үшін қарапайым дерекқор функциясын құрайық. Функцияны құру үшін келесі SQL кодын қолдана аламыз.
Енді біз функцияны келесідей қолданамыз:
бөлісуден * таңдаңыз. get_person_details (1);
Орындағаннан кейін біз келесі нәтижеге қол жеткіземіз.
2.3 сурет - Функцияның нәтижесі
Бұл біздің дерекқорды кодтауды аяқтайды. Фокусты go қабатына жылжытыңыз.
2.6 Go жобасын құру
Go жобасын жасап, оны go-postgresql-pgx-example деп атайық.
Келесі пәрменді орындау арқылы модульді инициализациялаңыз:
$ go mod init go-postgresql-pgx-example
Pg және pg бассейнін орнатыңыз
Енді біз pgx және pgpool орнатуымыз керек.
$ өтіңіз github.comjackcpgxv4 $
өтіңіз github.comjackcpgxv4pgxpool
Дерекқорға қосылу үшін біз pgx немесе pgpool қолдана аламыз. Біздің мысал үшін біз байланыс пулын жасаймыз. Төменде бұл үшін go кодының мысалы келтірілген.
Енді қарапайым select операторына қоңырау шалу үшін кодты қосайық. Мұны келесідей жасауға болады:
Функцияны орындау;
ДҚ функциясын шақыру үшін кодты да қосайық. Бұл шамалы айырмашылықтары бар сұранысты орындау сияқты.
Енді біз go бағдарламасын орындаған кезде, біз 2.4-суретте көрсетілген мәліметтер базасынан деректерді аламыз.
2.4 сурет - Бағдарламаның нәтижесі
3 Практикалық бөлімі
3.1 Қолданылатын бағдарламалық жасақтамалар
Дипломдық жұмысынң тақырыбы - Қорғаныс жүйесін қолдана отырып Web қосымшасын жасау.
Біріншіден, біз REPL-ді (оқу, бағалау, басып шығару , цикл) gin түрінде қолданамыз, бұл сіздің go қосымшаңызды кодтық базадағы кез-келген өзгерістермен қайта құрастыратын тірі құрастыру серверінің құралы.
Бізге пакеттік тәуелділік менеджері де қажет болады, ол үшін мен GoDep-ті қолданамын. Godep сонымен қатар жасау үшін жеткілікті ақылды vendorsкаталог және үшінші тарап бумаларын осы қалтаға жүктеңіз, егер сіз қолданбаны контейнерлегіңіз келсе, бұл қажет.
Жарайды, енді орта сұрыпталғаннан кейін, қалта құрылымы туралы сөйлесейік.
Бұл көптеген қалталар, мен олардың көпшілігін қарастырамын, бірақ қазір назар аудару керек ең маңызды қалталар:
үлгілер - біздің html сақтау үшін;
контроллерлер-біздің контроллерлерді сақтауға арналған;
модельдер-біздің деректер модельдерін сақтау үшін;
орташа. біздің қосымшаның бастапқы нүктесіне барады.
Ақырында, оның кодтық уақыты уақытты жоғалтпай, қоршаған ортаға енуге мүмкіндік береді.
негізгі пакет импорты (
"журнал" "орта маршрутизаторлар"жүйесі
жергілікті"github.comurfavenegron i" үшінші тұлға
) main () функциясы {
маршрутизатор: = маршрутизаторлар. Маршрутизаторды алыңыз ()
n: = негрони. Классикалық ()
n. реттелетін өңдеуші (маршрутизатор)
журнал. Println ("Тыңдау:")
N. орындау (":3001")}
3.1 сурет - Қалта ағашының құрылымы
Қалта ағашының құрылымы (сурет 3.1) - біз барлық қол жетімді қалталарды қарап, оңай пайдалану үшін сұрыптай аламыз.
Импортқа қарап, импортқа тапсырыс беру басқалардың түсінуі үшін өте пайдалы. Мұнда біз Go nethttp-мен тікелей жұмыс істейтін Negroni , шағын аралық бағдарламалық жасақтама кітапханасын қолданамыз. n. Run(":3001") біздің localhost:3001 қосымшасын іске қосады, өйткені біз gin-ді қолданамыз, біздің қосымшалар каталогынан gin --port:3000 іске қосайық, бұл біздің нақты уақыттағы қайта жүктеу серверіне арналған прокси-серверді іске қосады. Енді біздің веб-қосымшамызға 3000 немесе 3001 порттарынан кіруге болады. Әрине, Джиннің барлық мәні-оны 3000-мен пайдалану. Джинді қолдана отырып, мен өзгертулер енгізген сайын жобаны іске қосудықұрастыруды өткізіп жібере аламын.
3.2 сурет - Терминал терезесі
Ұсынылған терезе (сурет 3.2) кодты жазу кезінде жұмысты жеңілдетеді, егер пайдаланушы қате жіберсе, онда қатені өзі іздеудің қажеті жоқ, бағдарлама мұны өзі жасайды.
Біздің кодта қате болған кезде, содан кейін ол болмаған кезде терминал терезесі.
Енді маршрутизатордың айнымалысы қандай? Жақсы сұрақ, маршрутизаторға тереңірек үңілейік.go.
пакеттік маршрутизаторлар импорттау (
"желі http ""қоршаған ортаконтроллерлер"
"ортааралық бағдарлама"
"сәрсенбі URL""github.comgorillapat"
"github.comurfavenegroni"
) қосымшаның барлық бағыттарын тіркейді.
func GetRouter () *pat. Router {
URL пакетінен импортталған путиl жолдары
url_patterns: = urls. ReturnURLS ()
medium: = pat. New ()
medium. Get (url_patterns. HOME_PATH, controllers.HomeController)
common: = pat. New ()
статикалық маршрут
common. PathPrefix (url_patterns. STATIC_PATH). Handler (
http. StripPrefix (url_patterns. STATIC_PATH, http.FileServer(http.Dir("static")) ))
аралық бағдарламалық жасақтаманы қолдану
common. PathPrefix (url_patterns. MEDIUM_PATH).Handler(
negroni. New (
negroni. HandlerFunc (
middlewares. LoggingMiddleware),
negroni. Wrap (medium),
common. Get (url_patterns.LOGIN_PATH, controllers. LoginController)
common. Post (url_patterns.LOGIN_PATH, controllers. LoginController)
return common}
Жарайды, бұл файлда көп нәрсе болып жатыр, url_patterns айнымалысы URLs пакетінен қайтарылған мәндерді қамтиды.
URL пакетатип (
URL құрылымы {
STATIC_PATH жол
LOGIN_PATH жол
HOME_PATH жол
MEDIUM_PATH жол}
) func ReturnURLS () urls {
var url_patterns
url_patterns. STATIC_PATH = "static"
url_patterns.LOGIN_PATH = ""
url_patterns. MEDIUM_PATH = "medium"
url_patterns. HOME_PATH = url_patterns. MEDIUM_PATH + "home"
return url_patterns}
Бұл urls бума, мұнда біз қолданбамызға қол жеткізгіміз келетін барлық URL мекенжайларын анықтаймыз, мұнда анықталған URL мекенжайлары routers, controllers, templates бумаларында пайдаланылады. Осылайша, бізде URL мекенжайларын қолданбада басқаруғаөңдеуге болатын бір файл бар. Қолданбаға қосқымыз келетін кез-келген URL мекен-жайы осында жасалуы керек.
Маршрутизаторларға оралуы, барлық URL мекенжайларын алғаннан кейін біз контроллерлермен байланысты маршруттар жасай бастаймыз.
common: = pat. New ()
common. Get (url_patterns.LOGIN_PATH, controllers. LoginController)
common. Post (url_patterns.LOGIN_PATH, controllers. LoginController)
Мұнда жалпы болып табылады Pat нысаны, patбұл URL сұрауларын салыстыру үшін сорғыштың астындағы тұрақты өрнекті пайдаланатын маршрутизатор және сұрау менеджері.
Патчты орнату үшін go get https:github.comgorillapat
Әзірге біз бірнеше бумаларды орнаттық, Godep бумаларын файлға сақтайық, мұны godep save түймесін басу арқылы жасай аламыз, бұл көптеген нәрселерді жасайды, біріншіден, ол жасайды Godeps қолданбада қажет барлық бумаларды, соның ішінде бума нұсқаларын қамтитын JSON файлы бар каталог. Қандай жағдайда біз пакеттерді жоғалтамыз $gorootнемесе G gopathбіз JSON көмегімен оңай қалпына келтіре аламыз godep қалпына келтіру, ыңғайлы.
Қалай болғанда да , patу, қабылдау, жіберу, орнату, түзету, жою сияқты барлық негізгі http әдістері бар. Мен бұл демонстрация үшін тек get және post пайдалануды шештім.
common. Get (url_patterns.LOGIN_PATH, контроллерлер. LoginController)
Көріп отырғаныңыздай, әр бағыт келесідей болады, яғни.
маршрутизатор нысаны. http әдісі (шаблl үлгісі, сұрау жіберілетін контроллер)
Қолданбаға қосқыңыз келетін кез келген бағыт осы жерде орындалуы керек. Ол үшін бізге URL және контроллер қажет.
Мен маршрутизаторда сөйлескім келетін тағы бір нәрсе. контроллерлерге өтпес бұрын, бұл келесі екі жазба:
статикалық маршрут
common. PathPrefix (url_patterns. STATIC_PATH). Handler (
http. StripPrefix (url_patterns. STATIC_PATH, http. FileServer (http. Dir("static"))))
Бұл маршрут JS, CSS және кескіндер сияқты статикалық файлдарға қызмет көрсету үшін қолданылады.
Бұл маршрут негізінен "статикалық" префиксінен басталатын URL мекен-жайы бар кез-келген сұрау оның каталогтан файл іздейтінін білдіреді дейді. Статикалық, тікелей қызмет көрсетіледі.
аралық қабат бойынша қолдану
common. PathPrefix (url_patterns. MEDIUM_PATH). Handler (
negroni. New (
negroni. HandlerFunc (
middlewares. LoggingMiddleware),
negroni. Wrap(medium),
Егер біздің веб-серверге келген әрбір сұраныс қандай да бір өңдеуден өтуі керек болса ше? Мұнда negroni аралық бағдарламалары пайда болады. Мұнда біз URL мекен-жайы бар кез-келген сұраныс басталады деп айтамыз, орташа, loggingmiddleware жіберуі керекбірінші.
Middlewares-ті қарастырайық. go,
Пакеттің аралық қабаты бойынша импорт (
"fmt"
"nethttp"
"os"
"жолдар"
"уақыт"
) func LoggingMiddleware (res http. ResponseWriter, req *http. Request, next http. HandlerFunc) {
Сұрау туралы ақпаратты, яғни тақырыптарды, пайдаланушы агентін және т. б. журнал файлына жазу логикасы.
келесі (кесу, талап)}
Мен нақты іске асыруды жойдым, өйткені бұл жерде біз талқылағымыз келетін нәрсе емес. Мақаланың төменгі жағындағы бүкіл репозиторийге сілтеме.
Қабылдайды Loggingmiddleware, сұрау және жауап нысандары дәлел ретінде, содан кейін кез келген тапсырма аяқталғаннан кейін контроллерге бағыттау үшін бірдей нысандарды пайдаланады.
Контроллерлер, осылай
Маршрутизатордағы әрбір жазба файл контроллердегі контроллермен салыстырылады controllers пакетте.
пакет контроллеріимпорт (
"журнал"
"желіhttp"
"уақыт ""сәрсенбі көмекшілер"
"орта модельдер"
"сәрсенбі дүкен"
"қоршаған орташаблондар"
"сәрсенбі IRS"
"қоршаған ортаутилиталар" "github.comgorillaсхема"
) func LoginController (res http. ResponseWriter, req *http. Request) {
data: = make(map[string]interface {})
controller Template: = templates.LOGIN
url_patterns: = urls. ReturnURLS ()
if req. Method == "GET " {
utils. CustomTemplateExecute (res, req, controllerTemplate, data) }
if req. Method == "POST" {
err: = req. ParseForm ()
user: = new (models. User)
decoder: = schema. NewDecoder ()
err = decoder. Decode (user, req. Form)
if err! = nil {
utils. CustomTemplateExecute (res, req, controllerTemplate, data)
} else {
session, _: = utils. GetValidSession(req)
session. Мәндер ["бүркеншік ат"] = көмекшілер. StripWhiteSpaces(req.Форма ["Бүркеншік Ат"][0])
session. Save (req, res)
http. Redirect (res, req, url_patterns. HOME_PATH, http. StatusSeeOther)}
Контроллер жауап пен сұрау нысанын қабылдайды.
Data айнымалысы-кез-келген интерфейс мәнін қамтитын Жол кілттерінің картасы. Бұл туралы аздап сөйлесейік. HTML файлының жолын қамтитын пакеттің templates ішінен controllerTemplateconst жолы. url_patterns URLs пакетінен URL мекенжайларын қамтиды.
Міне, templates.html жолдары бар қосымша файл,
пакет шаблондарыconst BASE string = " templates base.html"
const HOME string = "templateshome.html"
const LOGIN string = "templateslogin.html"
const POSTS string = "templatesposts.html"
const POST_ADD string = "templates post_add.html"
const POST_VIEW string = "templatespost_view.html"
Енді әрбір контроллер get және post болып бөлінеді, Logincontroller-де utils сұраныстарын өңдеуші. Customtemplateexecute utils пакетінен. Қолданбаға қосылатын кез-келген шаблон осы жерде жасалуы керек.
Utils пакетіқолданбадағы кез-келген жалпы функцияны қамтиды, бұл бағдарлама ағынына көмектеседі.
Міне, utils қосымша файл,
пакеттік утилиталаримпорт (
"nethttp"
"жолдар"
"мәтін үлгі ""қоршаған ортамодельдер"
"қоршаған орташаблондар"
"сәрсенбі IRS""github.comgorillasessions"
) func CustomTemplateExecute (res http. ResponseWriter, req *http. Request, templateName string, data map[string]interface {}) {
Жалпы шаблондар мен ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz