Beth mae ymennydd myfyriwr yn dysgu am y byd cyfrifiadurol yn gallu ei wneud?

Ddiwrnod da.

Wedi gorffen ysgrifennu sgript arall yn Bash, sylweddolais y dylai popeth fod yn hollol wahanol, ond fe weithiodd popeth. Rwyf am ddangos i chi pa anweddusrwydd a baglau a ysgrifennais er mwyn datrys y broblem, ond heb gael wagen o wybodaeth eto. Mewn geiriau eraill, gwawdlun o raglennu.

Gorchwyl


Daeth rhywbeth yn angenrheidiol i:

  • Wedi arddangos llawer o rigymau ar gyfer y gair, heblaw am sgwariau
  • Croesi'r rhigymau niferus o ddau air

Am beth? Wel, dyna ni - a dyna ni.
Pwy sydd ddim yn gwybod, mae rhigwm sgwâr (yn gyffredin - sgwâr) yn ddau air y mae eu dwy lythyren olaf yn y sillafiad yn cyd-daro, sydd (yn aml, dyma'r unig beth) yn eu gwneud yn odl. Er enghraifft, mae rhosod yn rhewllyd; teiar - car. Nid yw'r defnydd o sgwariau mewn versification modern yn cael ei gymeradwyo'n arbennig gan bobl, oherwydd eu cyntefigrwydd.

penderfyniad


Roedd yn ymddangos i mi mai'r ateb symlaf oedd ysgrifennu sgript yn Bash sy'n defnyddio generadur rhigymau a oedd eisoes yn bodoli - HOST, sy'n eu dewis yn bennaf yn ôl cytsain, ac nid trwy sillafu. Pa fath o HOST? Oherwydd os nodwch enw go iawn y wefan, byddant yn dweud ei fod yn hysbyseb. Beth am barhau i'w ddefnyddio? Yn gyntaf, er gwaethaf ei fantais o ddewis rhigymau yn seiliedig ar gytseiniaid, mae'n dal i gynhyrchu sgwariau yn aml. Yn ail, mae'n rhaid i chi feddwl gyda'ch ymennydd o hyd, treulio amser yn newid rhwng tabiau, ac egni yn cofio geiriau ailadroddus mewn rhestrau i ddod o hyd i rigwm ar gyfer dau air.

Cael rhigymau cryf

Beth ydw i'n ei wybod? Rwy'n gwybod am y cyfleustodau wget, sy'n lawrlwytho'r dudalen yn yr URL penodedig. Iawn, gadewch i ni weithredu'r cais - rydym yn cael tudalen HTML mewn ffeil a enwir gyda gair sy'n odli. Er enghraifft, gadewch i ni chwilio am y gair “yma”:

wget https://HOST/rifma/здесь

Ond dim ond rhestr o eiriau sydd ei angen arnaf, sut alla i gael gwared ar bopeth arall? Edrychwn a gwelwn fod y rhestr o eiriau wedi ei fformatio, ni waeth pa mor rhyfedd ydyw, ar ffurf rhestr, ac mae'r geiriau mewn tagiau . Wel, mae gennym ddefnyddioldeb gwych. syched - gadewch i ni ei ysgrifennu i lawr fel hyn:

cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word

Yn gyntaf, rydyn ni'n dewis llinellau o'r ffeil geiriau sy'n cynnwys y tag - rydyn ni'n cael criw o dagiau gwag a llinellau gyda geiriau. Rydyn ni'n tynnu'r tag ei ​​hun a'i un cau - dyma symbolau cant yn cael eu defnyddio yn lle slaes oherwydd bod gan y tag ei hun slaes yn barod, a dyna pam syched ddim yn eich deall ychydig. Ac mae popeth yn iawn gyda diddordeb. Rydym yn tynnu pob gofod o'r ffeil, yn tynnu llinellau gwag. Voila - rhestr barod o eiriau.

Er mwyn tynnu geiriau sy'n odli gan ddefnyddio'r llythrennau olaf, dewiswch y ddwy lythyren olaf o'r gair gwreiddiol a chlirio'r rhestr:

squad=${word:((${#word}-2)):2}
cat $word | sed -e "/.$squad$/d" 1> $word

Edrychwn, ceisiwn - mae popeth yn gweithio... felly, ble mae'r rhestr ar gyfer y gair “chwarae”? Ac am y gair “dwi’n mynd”? Mae'r ffeil yn wag! Ac mae hyn i gyd oherwydd mai berfau yw'r geiriau hyn, a gwyddom beth maen nhw'n ei wneud i'r rhai sy'n odli â berfau. Mae odl berfol yn waeth na hyd yn oed odl sgwâr, oherwydd yn yr iaith Rwsieg mae'r nifer fwyaf o ferfau, ac mae gan bob un ohonynt yr un terfyniadau, a dyna pam nad oeddent yn y ffeil olaf ar ôl gwirio'r terfyniadau.

Fodd bynnag, nid ydym ar unrhyw frys. Ar gyfer pob gair mae nid yn unig odlau, ond hefyd gyseiniannau, sydd weithiau'n swnio'n llawer gwell nag odl - dyna pam maen nhw'n gyseiniannau (cysain Ffrangeg, o'r Lladin assono - dwi'n swnio mewn harmoni).

Cawn gysondebau

Dyma lle mae'r hwyl yn dechrau: mae cyfeiriadau yn ymddangos mewn URL ar wahân, ac ar yr un dudalen, trwy weithredu sgript, anfon cais HTTP a derbyn ymateb. Sut alla i ddweud wget‘Ydych chi’n pwyso botwm? Ond dim ffordd. Yn drist.

Gan sylwi bod yr URL yn y llinell yn newid rhywsut, fe wnes i gopïo beth oedd yno ar ôl newid i assonances a'i gludo mewn tab porwr newydd - rhigymau cryf yn agor. Nid hynny.

Yn y bôn, meddyliais, ni ddylai fod ots i'r gweinydd a yw'r sgript sy'n anfon y cais ato yn cael ei weithredu, neu a yw'r person yn ei deipio â llaw. Felly? Pwy a wyr, gadewch i ni edrych arno.

Ble i anfon? Beth i'w anfon? Cais HTTP i IP y gweinydd, mae rhywbeth fel GET ... yna mae rhywbeth HTTP/1.1... Mae angen i ni weld beth mae'r porwr yn ei anfon ac i ble. Gosod wireshark, edrychwch ar y traffig:

0040 37 5d a3 84 27 e7 fb 13 6d 93 ed cd 56 04 9d 82 7]£.'çû.m.íÍV...
0050 32 7c fb 67 46 71 dd 36 4d 42 3d f3 62 1b e0 ad 2|ûgFqÝ6MB=ób.à.
0060 ef 87 be 05 6a f9 e1 01 41 fc 25 5b c0 77 d3 94 ï.¾.jùá.Aü%[ÀwÓ.

Ym... beth? O ie, mae gennym HTTPS. Beth i'w wneud? Lansio ymosodiad MITM arnoch chi'ch hun? Yn ddelfrydol, bydd y dioddefwr ei hun yn ein helpu ni.

Yn gyffredinol, ar ôl penderfynu syrffio'r porwr, cefais y cais ei hun a'r derbynnydd o'r diwedd. Ewch:

Deialog gyda'r derfynell

telnet IP PORT
Trying IP...
Connected to IP.
Escape character is '^]'.
GET /rifma/%D0%BC%D0%B0%D1%82%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Connection: close

HTTP/1.1 400 Bad Request
Server: nginx/1.8.0
Date: Sun, 03 Nov 2019 20:06:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 270
Connection: close

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
Connection closed by foreign host.

Hei. Hehehe. Yn wir, dyna beth roeddwn i'n ei ddisgwyl wrth anfon cais HTTP noeth i borthladd HTTPS. A ddylem ni amgryptio nawr? Mae hyn i gyd yn ffwdan gydag allweddi RSA, yna gyda SHA256. Pam, mae yna OpenSSL am bethau felly. Wel, rydyn ni eisoes yn gwybod beth i'w wneud, byddwn ni'n dileu'r meysydd Atgyfeirio a Chwcis yn gyntaf - dwi'n meddwl na fyddant yn effeithio llawer ar y mater:

Deialog gyda'r derfynell

openssl s_client -connect IP:PORT
{Всякие ключи, сертификаты}
GET /rifma/%D0%B7%D0%B4%D0%B5%D1%81%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/javascript,text/html,application/xml,text/xml,*/*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK
Date: Sun, 03 Nov 2019 20:34:33 GMT
Set-Cookie: COOKIE
X-Powered-By: Phusion Passenger 5.0.16
Server: nginx/1.8.0 + Phusion Passenger 5.0.16
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: block-all-mixed-content
Content-Encoding: gzip

Beth mae ymennydd myfyriwr yn dysgu am y byd cyfrifiadurol yn gallu ei wneud?

Beth yw hyn, rhegi ar y gweinydd? Wel, o leiaf fe wnaethon nhw fy ateb 200 OK, sy'n golygu nad yw cwcis a'r cyfeiriwr yn effeithio ar unrhyw beth. Mae cywasgu yn gzip, ond wrth gopïo, mae nodau ASCII yn cael eu copïo. Yn union, gallwch chi gael gwared ar y llinell Derbyn-amgodio. Mae popeth yn iawn - rydym yn cael dogfen HTML, nawr gyda chyseiniannau. Ond dyma ddau gwestiwn: sut i redeg OpenSSL a throsglwyddo data iddo gan ddefnyddio sgript? A sut i ddarllen yr allbwn os ydym yn aros, fel petai, mewn “cragen” OpenSSL ar ôl derbyn yr ymateb? Os gallwch chi feddwl am rywbeth gyda'r ail, ond gyda'r cyntaf ...

Mae'n dda bod yna Habrlle darllenais am y cyfleustodau disgwyl, sy'n awtomeiddio'r broses o ryngweithio â rhaglenni sy'n disgwyl rhyngweithio dynol. Mae cael tîm hyd yn oed yn fwy deniadol yn disgwyl, cynhyrchu disgwyl sgript yn seiliedig ar eich gweithredoedd. Wel, rydyn ni'n ei lansio, yn gwneud hyn i gyd a dyma'r sgript orffenedig. Dim ond ei fod yn enfawr iawn, ac i gyd oherwydd OpenSSL yn arddangos tystysgrifau, allweddi, a disgwyl yn aros am allbwn hyn i gyd. A oes angen hyn arnom? Nac ydw. Rydyn ni'n tynnu'r anogwr cyntaf cyfan, gan adael dim ond y toriad llinell olaf 'r'. Rydym hefyd yn dileu'r meysydd Defnyddiwr-Asiant a Derbyn o'n cais - nid ydynt yn effeithio ar unrhyw beth. Felly, gadewch i ni lansio. Gweithredwyd y sgript, ond ble mae'r ddogfen HTML a drysorir? Disgwyl ei fwyta. Er mwyn gwneud iddo ei boeri allan, mae angen ichi roi:

set results $expect_out(buffer)

cyn diwedd y sgript - dyma sut y bydd allbwn y gweithredadwy yn cael ei ysgrifennu disgwylgorchymyn ‘om ac yn cael ei arddangos ar y sgrin. I grynhoi, rhywbeth fel hyn:

disgwyl sgript

#!/usr/bin/expect -f

set timeout -1
spawn openssl s_client -connect IP:PORT
match_max 100000
expect -exact "
---r
"
send -- "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1rHost: HOSTrAccept-Language: en-US,en;q=0.5rX-Requested-With: XMLHttpRequestrConnection: close"
expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1r
Host: HOSTr
Accept-Language: en-US,en;q=0.5r
X-Requested-With: XMLHttpRequestr
Connection: close"
send -- "r"
set results $expect_out(buffer)
expect -exact "r
"
send -- "r"
expect eof

Ond nid dyna'r cyfan! Fel y gallwch weld, ym mhob enghraifft roedd URL y cais yn sefydlog, ond yr URL sy'n gyfrifol am ba air a fydd yn gysylltiedig â chysoniannau. Ac felly mae'n troi allan y byddwn yn chwilio'n gyson am y gair “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” yn ASCII neu “yma” yn UTF-8. Beth i'w wneud? Wrth gwrs, dim ond creu sgript newydd bob tro, gyfeillion! Ddim bellach yn disgwyl'om, a chyda chymorth colli, achos Yn ein newydd ni, nid oes dim yn newid ond y gair. A hir oes y broblem newydd: sut allwn ni gyfieithu gair o Cyrillic i fformat URL yn ddeallus? Does dim byd arbennig i'r derfynell chwaith. Wel, mae'n iawn, gallwn ei wneud, iawn? Gall:

Edrychwch beth alla i ei wneud!

function furl {
furl=$(echo "$word" | sed 's:А:%d0%90:g;s:Б:%d0%91:g;s:В:%d0%92:g;s:Г:%d0%93:g;s:Д:%d0%94:g;s:Е:%d0%95:g;s:Ж:%d0%96:g;s:З:%d0%97:g;s:И:%d0%98:g;s:Й:%d0%99:g;s:К:%d0%9a:g;s:Л:%d0%9b:g;s:М:%d0%9c:g;s:Н:%d0%9d:g;s:О:%d0%9e:g;s:П:%d0%9f:g;s:Р:%d0%a0:g;s:С:%d0%a1:g;s:Т:%d0%a2:g;s:У:%d0%a3:g;s:Ф:%d0%a4:g;s:Х:%d0%a5:g;s:Ц:%d0%a6:g;s:Ч:%d0%a7:g;s:Ш:%d0%a8:g;s:Щ:%d0%a9:g;s:Ъ:%d0%aa:g;s:Ы:%d0%ab:g;s:Ь:%d0%ac:g;s:Э:%d0%ad:g;s:Ю:%d0%ae:g;s:Я:%d0%af:g;s:а:%d0%b0:g;s:б:%d0%b1:g;s:в:%d0%b2:g;s:г:%d0%b3:g;s:д:%d0%b4:g;s:е:%d0%b5:g;s:ж:%d0%b6:g;s:з:%d0%b7:g;s:и:%d0%b8:g;s:й:%d0%b9:g;s:к:%d0%ba:g;s:л:%d0%bb:g;s:м:%d0%bc:g;s:н:%d0%bd:g;s:о:%d0%be:g;s:п:%d0%bf:g;s:р:%d1%80:g;s:с:%d1%81:g;s:т:%d1%82:g;s:у:%d1%83:g;s:ф:%d1%84:g;s:х:%d1%85:g;s:ц:%d1%86:g;s:ч:%d1%87:g;s:ш:%d1%88:g;s:щ:%d1%89:g;s:ъ:%d1%8a:g;s:ы:%d1%8b:g;s:ь:%d1%8c:g;s:э:%d1%8d:g;s:ю:%d1%8e:g;s:я:%d1%8f:g;s:ё:%d1%91:g;s:Ё:%d0%81:g')}

Yn gyfan gwbl, mae gennym sgript sy'n trosi gair yn destun ASCII, gan gynhyrchu sgript arall sy'n gofyn am dudalen gwefan gyda chyseiniaid o'r gweinydd trwy OpenSSL. Ac yna rydym yn ailgyfeirio allbwn y sgript olaf i ffeil ac, yn y ffordd hen ffasiwn, yn ei drosglwyddo "hidlwyr" sgwariau ychwanegol a'u hysgrifennu i'r ffeil.

Croestoriad o lawer. Llinell waelod

Mewn gwirionedd, dyma'n union beth sy'n achosi'r problemau lleiaf. Rydym yn cyflawni'r gweithdrefnau uchod ar gyfer dau air, yna o'r ddwy restr rydym yn cymharu pob gair â phob un ac os canfyddir cyfatebiaeth, rydym yn ei allbynnu. Nawr mae gennym ni sgript sy'n cymryd dau air fel mewnbwn ac yn arddangos rhestr o eiriau sy'n odli gyda'r ddau, a hyd yn oed yn cymryd i ystyriaeth cytseiniaid, a hyn i gyd heb symud â llaw rhwng pedwar tab a chofio geiriau “wrth y llygad” - mae hynny i gyd wedi'i gasglu, cyfrif amdano a'i waredu'n awtomatig. Gwych.

Pwrpas y cyhoeddiad hwn oedd dangos, os oes angen rhywbeth ar berson, y bydd yn ei wneud beth bynnag. Aneffeithiol iawn, cam, iasol, ond bydd yn gweithio.

Ffynhonnell: hab.com

Ychwanegu sylw