Компьютер дүйнөсүн үйрөнгөн окуучунун мээси эмнеге жөндөмдүү?

Жакшы күн.

Башта дагы бир сценарий жазып бүтүп, мен баары таптакыр башкача болушу керек экенин түшүндүм, бирок баары иштеди. Маселени чечүү үчүн кандай уятсыз сөздөрдү, балдактарды жазганымды көрсөткүм келет, бирок али билимдин арабасы жок. Башкача айтканда, программалоонун карикатурасы.

маселе


Бир нерсе керек болуп калды:

  • Квадраттардан башка сөздүн көптөгөн рифмалары көрсөтүлгөн
  • Эки сөздүн көп рифмаларын кесип өттү

Эмне үчүн? Мейли, ушунусу менен бүттү.
Ким билбейт, чарчы рифма (жалпы тилде - чарчы) бул орфографиядагы акыркы эки тамгасы дал келген эки сөз (көбүнчө бул бир гана нерсе) аларды рифма кылат. Мисалы, розалар аяздуу; шина - машина. Заманбап версификацияда квадраттарды колдонуу, алардын примитивдүүлүгүнө байланыштуу адамдар тарабынан өзгөчө жактырылган эмес.

чечим


Мага эң жөнөкөй чечим - Башта мурунтан эле бар рифма генераторун - HOST колдонгон сценарийди жазуу болуп көрүндү, ал биринчи кезекте аларды орфография боюнча эмес, консонанс боюнча тандайт. Кандай HOST? Себеби сайттын чыныгы атын көрсөтсө жарнама экен деп айтышат. Эмне үчүн аны колдонууну улантууга болбойт? Биринчиден, рифмаларды үнсүздөрдүн негизинде тандап алуу артыкчылыгына карабастан, ал дагы эле квадраттарды көп чыгарат. Экинчиден, сиз дагы эле мээңиз менен ойлонушуңуз керек, эки сөздүн рифмасын табуу үчүн тизмелердеги кайталанма сөздөрдү жаттап алууга убакыт коротушуңуз керек.

Күчтүү рифмаларды алуу

Мен эмнени билем? Мен коммуналдык жөнүндө билем ачуу, ал баракты көрсөтүлгөн URL дарегине жүктөйт. Макул, келгиле, суранычты аткаралы - рифмалуу сөз менен аталган файлдагы HTML барагын алабыз. Мисалы, "бул жерде" деген сөздү издеп көрөлү:

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

Бирок мага сөздөрдүн тизмеси гана керек, калганынан кантип кутулам? Сөздөрдүн тизмеси кандай кызык болсо да тизмек түрүндө форматталганын, сөздөр тегинде экенин карап, көрүп жатабыз. Ооба, бизде сонун жардам бар. Бирок - келгиле, мындай жазалы:

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

Биринчиден, биз сөз файлынан теги камтылган саптарды тандайбыз - биз бир топ бош тегдерди жана сөздөрү бар саптарды алабыз. Тегдин өзүн жана анын жабылышын алып салабыз - бул жерде сызыктардын ордуна пайыздык символдор колдонулат, анткени тегинин өзүндө сызык бар, ошондуктан Бирок сени бир аз түшүнбөйт. Ал эми кызыгуу менен баары жакшы. Биз файлдан бардык боштуктарды алып салабыз, бош сызыктарды алып салабыз. Voila - сөздөрдүн даяр тизмеси.

Акыркы тамгалар менен рифмалуу сөздөрдү алып салуу үчүн түпнуска сөздөн акыркы эки тамганы тандап, тизмени тазалаңыз:

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

Биз карап жатабыз, аракет кылабыз - баары иштейт... анда "ойно" деген сөздүн тизмеси кайда? Ал эми "мен барам" деген сөз үчүнбү? Файл бош! Мунун баары бул сөздөр этиштер болгондуктан, биз алардын этиштер менен рифмалашкандарга эмне кыларын билебиз. Этиштин рифмасы чарчы рифмадан да начар, анткени орус тилинде этиштер эң көп, алардын бардыгында бирдей эле жалгашуулар бар, ошондуктан алар акыркы файлдарды текшергенден кийин акыркы файлда жок болгон.

Бирок, биз шашкан жокпуз. Ар бир сөз үчүн рифмалар гана эмес, кээде рифмага караганда алда канча жакшыраак угулат ассонанстар да бар - ошондуктан алар ассонанс (французча ассонанс, латын тилинен assono - мен гармонияда угулат).

Биз ассонанстарды алабыз

Кызык ушул жерден башталат: ассонанстар өзүнчө URL дарегинде жана ошол эле бетте сценарийди аткаруу, HTTP сурамын жөнөтүү жана жооп алуу аркылуу пайда болот. Кантип айтсам болот ачуу'Сиз кнопканы басасызбы? Бирок жол жок. Тилекке каршы.

Саптагы URL кандайдыр бир түрдө өзгөрүп жатканын байкап, мен ассонанстарга өткөндөн кийин ал жерде эмне бар экенин көчүрүп алып, аны жаңы браузер өтмөгүнө чаптадым - күчтүү рифмалар ачылды. Андай эмес.

Негизи серверге суроо-талапты жөнөткөн скрипт аткарылабы же адам аны кол менен терип жатабы, бул маанилүү эмес деп ойлодум. Демек? Ким билет, барып текшерип көрөлү.

Кайда жөнөтүү керек? Эмне жөнөтүү керек? IP серверине HTTP суроосу, GET сыяктуу бир нерсе бар... анда HTTP/1.1 деген нерсе бар... Биз браузер эмнени жана кайда жөнөтөрүн көрүшүбүз керек. Орнотуу Wireshark, трафикти караңыз:

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Ó.

Мм... эмне? Ооба, бизде HTTPS бар. Эмне кылуу керек? Өзүңүзгө MITM чабуулун баштаңызбы? Идеалында, жабырлануучу өзү бизге жардам берет.

Жалпысынан, браузерди кыдырууну чечип, мен акыры сурамдын өзүн жана дарегин таптым. Барыңыз:

Терминал менен диалог

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.

Эй. Хехе. Чынында эле, HTTPS портуна жылаңач HTTP сурам жөнөткөндө мен күткөн нерсе. Эми шифрлешибиз керекпи? Мунун баары RSA баскычтары менен, андан кийин SHA256 менен ызы-чуу. Эмнеге, бар OpenSSL ушундай нерселер үчүн. Ооба, биз эмне кылууну билебиз, биз жөн гана Referer жана Cookie талааларын алып салабыз - алар маселеге көп деле таасир этпейт деп ойлойм:

Терминал менен диалог

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

Компьютер дүйнөсүн үйрөнгөн окуучунун мээси эмнеге жөндөмдүү?

Бул эмне, серверде сөгүнүү? Жок дегенде, алар мага 200 OK деп жооп беришти, бул кукилер жана реферер эч нерсеге таасир этпейт дегенди билдирет. Кысуу gzip, бирок көчүрүү учурунда ASCII символдору көчүрүлөт. Тактап айтканда, сиз сызыкты алып салсаңыз болот Кабыл алуу-коддоо. Баары жакшы - биз HTML документти алабыз, азыр ассонанстар менен. Бирок бул жерде эки суроо бар: OpenSSLди кантип иштетүү жана ага скрипт аркылуу маалыматтарды өткөрүү керек? Эгер жооп алгандан кийин биз OpenSSL "кабыгында" калсак, жыйынтыкты кантип окуу керек? Эгер экинчиси менен бир нерсе ойлоп таба алсаңыз, бирок биринчиси менен...

Бар болгону жакшы Хабркайдан мен коммуналдык жөнүндө окудум күтүү, бул адамдардын өз ара аракеттенүүсүн күткөн программалар менен өз ара аракеттенүү процессин автоматташтырат. Командага ээ болуу андан да жагымдуу автокүтүү, жаратуу күтүү скрипт сиздин аракеттериңизге негизделген. Ооба, биз аны ишке киргизебиз, мунун баарын кылабыз жана бул жерде даяр сценарий. Бир гана ал абдан чоң, жана баары, анткени OpenSSL сертификаттарды, ачкычтарды жана көрсөтөт күтүү мунун баарынын жыйынтыгын күтөт. Бул бизге керекпи? Жок. Биз биринчи чакырууну толугу менен алып салабыз, акыркы сап үзүлүшүн гана калтырабыз "r". Ошондой эле биз өтүнүчүбүздөн Колдонуучу-Агент жана Кабыл алуу талааларын алып салабыз - алар эч нерсеге таасир этпейт. Ошентип, ишке киргизели. Скрипт аткарылды, бирок баалуу HTML документи кайда? күтүү жеди. Аны түкүрүшү үчүн, төмөнкүлөрдү коюш керек:

set results $expect_out(buffer)

скрипттин аягына чейин - аткарылуучунун чыгышы ушундайча жазылат күтүү'om буйругу жана экранда көрсөтүлөт. Кыскача айтканда, бул сыяктуу бир нерсе:

сценарий күтөт

#!/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

Бирок бул баары эмес! Көрүнүп тургандай, бардык мисалдарда суроо-талаптын URL дареги статикалык болгон, бирок бул URL кайсы сөздүн ассонанстар менен байланыштырылышына жооптуу. Ошентип, биз ASCIIде "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" же UTF-8де "бул жерде" деген сөздү тынымсыз издейбиз. Эмне кылуу керек? Албетте, жөн гана ар дайым жаңы скрипт жаратыңыз, достор! Эми жок автокүтүү'ом, жана жардамы менен жаңырык, анткени Биздин жаңы, сөздөн башка эч нерсе өзгөрбөйт. Жашасын жаңы көйгөй: кириллицадан бир сөздү кантип URL форматына акылдуу түрдө которо алабыз? Терминал үчүн да өзгөчө эч нерсе жок. Макул, биз муну кыла алабыз, туурабы? кыла алат:

Карачы, мен эмне кыла алам!

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')}

Жалпысынан бизде сөздү ASCII текстине айландырган скрипт бар, ал OpenSSL аркылуу серверден ассонанстары бар сайт барагын сураган башка скриптти жаратат. Анан биз акыркы скрипттин чыгышын файлга багыттайбыз жана эски ыкма менен аны өткөрүп беребиз "фильтрлер" кошумча квадраттарды жана аларды файлга жаз.

Көптөрдүн кесилиши. Төмөнкү сызык

Чынында, бул эң аз көйгөйлөрдү жаратат. Жогорудагы процедураларды эки сөз үчүн аткарабыз, андан кийин эки тизмеден ар бир сөздү ар бири менен салыштырып, эгер дал келүү табылса, аны чыгарабыз. Эми бизде эки сөздү киргизүү катары кабыл алган жана экөөнө тең рифмалуу сөздөрдүн тизмесин көрсөткөн скрипт бар, жада калса ассонанстарды эске алуу менен, мунун бардыгы төрт өтмөктүн ортосунда кол менен которулбастан жана "көз менен" деген сөздөрдү эстеп калбастан - бардыгы чогултулган, эсепке алынган. үчүн жана автоматтык түрдө жок кылынат. Керемет.

Бул басылманын максаты, эгер адамга бир нерсе керек болсо, баары бир аны жасай турганын көрсөтүү болгон. Абдан натыйжасыз, ийри, үрөй учурарлык, бирок ал иштейт.

Source: www.habr.com

Комментарий кошуу