கணினி உலகத்தைப் பற்றிக் கற்றுக் கொள்ளும் ஒரு மாணவரின் மூளையின் திறன் என்ன?

நாள் நேரம்.

பாஷில் மற்றொரு ஸ்கிரிப்டை எழுதி முடித்த பிறகு, எல்லாம் முற்றிலும் வித்தியாசமாக இருக்க வேண்டும் என்பதை உணர்ந்தேன், ஆனால் எல்லாம் வேலை செய்தது. சிக்கலைத் தீர்ப்பதற்காக நான் என்ன ஆபாசங்கள் மற்றும் ஊன்றுகோல்களை எழுதினேன் என்பதை உங்களுக்குக் காட்ட விரும்புகிறேன், ஆனால் இன்னும் அறிவின் வேகன் இல்லை. வேறு வார்த்தைகளில் கூறுவதானால், நிரலாக்கத்தின் கேலிச்சித்திரம்.

பணி


இதற்கு ஏதோ அவசியமானது:

  • சதுரங்களைத் தவிர, வார்த்தைக்கு பல ரைம்களைக் காட்டியது
  • இரண்டு வார்த்தைகளின் பல ரைம்களைக் கடந்தது

எதற்காக? சரி, அவ்வளவுதான் - அவ்வளவுதான்.
யாருக்குத் தெரியாது, ஒரு சதுர ரைம் (பொதுவாகப் பேசினால் - ஒரு சதுரம்) என்பது எழுத்துப்பிழையின் கடைசி இரண்டு எழுத்துக்கள் ஒன்றிணைந்த இரண்டு சொற்கள், இது (பெரும்பாலும், இது மட்டுமே) அவற்றை ஒரு ரைம் ஆக்குகிறது. உதாரணமாக, ரோஜாக்கள் உறைபனி; டயர் - கார். நவீன வசனங்களில் சதுரங்களைப் பயன்படுத்துவது அவற்றின் பழமையான தன்மையால் குறிப்பாக மக்களால் அங்கீகரிக்கப்படவில்லை.

முடிவு


ஏற்கனவே இருக்கும் ரைம் ஜெனரேட்டரைப் பயன்படுத்தும் பாஷில் ஒரு ஸ்கிரிப்டை எழுதுவதே எளிய தீர்வு என்று எனக்குத் தோன்றியது - HOST, இது முதன்மையாக அவற்றை மெய்யெழுத்து மூலம் தேர்ந்தெடுக்கிறது, மற்றும் எழுத்துப்பிழை மூலம் அல்ல. என்ன வகையான HOST? ஏனெனில் தளத்தின் உண்மையான பெயரைக் குறிப்பிட்டால் அது விளம்பரம் என்று சொல்வார்கள். அதை ஏன் தொடர்ந்து பயன்படுத்தக்கூடாது? முதலாவதாக, மெய்யெழுத்துக்களின் அடிப்படையில் ரைம்களைத் தேர்ந்தெடுப்பதில் அவருக்கு நன்மை இருந்தாலும், அவர் இன்னும் அடிக்கடி சதுரங்களை உருவாக்குகிறார். இரண்டாவதாக, நீங்கள் இன்னும் உங்கள் மூளையுடன் சிந்திக்க வேண்டும், தாவல்களுக்கு இடையில் மாறுவதற்கு நேரத்தை செலவிட வேண்டும், மேலும் இரண்டு வார்த்தைகளுக்கு ஒரு ரைம் கண்டுபிடிக்க பட்டியல்களில் மீண்டும் மீண்டும் வார்த்தைகளை மனப்பாடம் செய்ய ஆற்றல் வேண்டும்.

வலுவான ரைம்களைப் பெறுதல்

எனக்கு என்ன தெரியும்? பயன்பாடு பற்றி எனக்குத் தெரியும் wget,, இது குறிப்பிட்ட 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

நாங்கள் பார்க்கிறோம், முயற்சிக்கிறோம் - எல்லாம் வேலை செய்கிறது ... எனவே, "ப்ளே" என்ற வார்த்தைக்கான பட்டியல் எங்கே? மற்றும் "நான் போகிறேன்" என்ற வார்த்தைக்காகவா? கோப்பு காலியாக உள்ளது! இந்த வார்த்தைகள் வினைச்சொற்கள் என்பதால் இவை அனைத்தும், மேலும் வினைச்சொற்களுடன் ரைம் செய்பவர்களுக்கு அவை என்ன செய்கின்றன என்பது எங்களுக்குத் தெரியும். வினைச்சொல் ரைம் சதுர ரைமை விட மோசமானது, ஏனென்றால் ரஷ்ய மொழியில் அதிக வினைச்சொற்கள் உள்ளன, மேலும் அவை அனைத்தும் ஒரே மாதிரியான முடிவுகளைக் கொண்டுள்ளன, அதனால்தான் அவை முடிவுகளைச் சரிபார்த்த பிறகு இறுதி கோப்பில் இல்லை.

இருப்பினும், நாங்கள் அவசரப்படவில்லை. ஒவ்வொரு வார்த்தைக்கும் ரைம்கள் மட்டுமல்ல, சில சமயங்களில் ரைம்களை விட மிகவும் சிறப்பாக ஒலிக்கும் அசோனன்ஸ்களும் உள்ளன - அதனால்தான் அவை அசோனன்ஸ் (பிரெஞ்சு அசோனன்ஸ், லத்தீன் அசோனோவிலிருந்து - நான் இணக்கமாக ஒலிக்கிறேன்).

நமக்கு அனுமானங்கள் கிடைக்கும்

இங்குதான் வேடிக்கை தொடங்குகிறது: ஒரு தனி URL இல், அதே பக்கத்தில், ஸ்கிரிப்டை இயக்குவதன் மூலம், HTTP கோரிக்கையை அனுப்புவதன் மூலம் மற்றும் பதிலைப் பெறுவதன் மூலம் அசோனன்ஸ்கள் தோன்றும். நான் எப்படி சொல்ல முடியும் wget,‘ஒரு பட்டனை அழுத்துகிறீர்களா? ஆனால் வழி இல்லை. வருத்தமாக.

வரியில் உள்ள URL எப்படியோ மாறுவதைக் கவனித்த நான், அசோனன்ஸ்களுக்கு மாறிய பிறகு இருந்ததை நகலெடுத்து புதிய உலாவி தாவலில் ஒட்டினேன் - வலுவான ரைம்கள் திறக்கப்பட்டன. அது அல்ல.

அடிப்படையில், கோரிக்கையை அனுப்பும் ஸ்கிரிப்ட் செயல்படுத்தப்படுகிறதா, அல்லது நபர் அதை கையால் தட்டச்சு செய்கிறார்களா என்பது சேவையகத்திற்கு முக்கியமில்லை என்று நான் நினைத்தேன். அதனால்? யாருக்குத் தெரியும், போய்ப் பார்க்கலாம்.

எங்கு அனுப்புவது? என்ன அனுப்ப வேண்டும்? சர்வர் ஐபிக்கு HTTP கோரிக்கை, GET போன்ற ஒன்று உள்ளது... பிறகு HTTP/1.1 ஒன்று உள்ளது... உலாவி எதை எங்கு அனுப்புகிறது என்பதைப் பார்க்க வேண்டும். நிறுவு வயர்ஷார்க், போக்குவரத்தைப் பாருங்கள்:

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 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 சரி என்று பதிலளித்தார்கள், அதாவது குக்கீகள் மற்றும் பரிந்துரைப்பவர் எதையும் பாதிக்காது. சுருக்கமானது gzip ஆகும், ஆனால் நகலெடுக்கும் போது, ​​ASCII எழுத்துக்கள் நகலெடுக்கப்படும். சரியாக, நீங்கள் வரியை அகற்றலாம் ஏற்றுக்கொள்-குறியீடு. எல்லாம் நன்றாக இருக்கிறது - இப்போது ஒரு HTML ஆவணத்தைப் பெறுகிறோம். ஆனால் இங்கே இரண்டு கேள்விகள் உள்ளன: OpenSSL ஐ இயக்குவது மற்றும் ஸ்கிரிப்டைப் பயன்படுத்தி தரவை மாற்றுவது எப்படி? பதிலைப் பெற்ற பிறகு நாம் OpenSSL “ஷெல்” இல் இருந்தால், வெளியீட்டை எவ்வாறு படிப்பது? இரண்டாவதாக ஏதாவது ஒன்றைக் கொண்டு வர முடிந்தால், ஆனால் முதல்...

இருப்பது நல்லது ஹப்ர்அங்கு நான் பயன்பாடு பற்றி படித்தேன் எதிர்பார்க்க, இது மனித தொடர்புகளை எதிர்பார்க்கும் நிரல்களுடன் தொடர்பு கொள்ளும் செயல்முறையை தானியங்குபடுத்துகிறது. ஒரு குழுவை வைத்திருப்பது இன்னும் கவர்ச்சிகரமானது சுய எதிர்பார்ப்பு, உருவாக்கும் எதிர்பார்க்க உங்கள் செயல்களின் அடிப்படையில் ஸ்கிரிப்ட். சரி, நாங்கள் அதைத் தொடங்குகிறோம், இதையெல்லாம் செய்கிறோம், இதோ முடிக்கப்பட்ட ஸ்கிரிப்ட். அவர் மட்டுமே மிகப் பெரியவர், எல்லாவற்றுக்கும் காரணம் பிஎச்பி சான்றிதழ்கள், விசைகள் மற்றும் எதிர்பார்க்க இவை அனைத்தின் வெளியீட்டிற்காக காத்திருக்கிறது. நமக்கு இது தேவையா? இல்லை. முதல் வரியை முழுவதுமாக அகற்றி, கடைசி வரி முறிவு ‘r’ ஐ மட்டும் விட்டுவிடுகிறோம். எங்கள் கோரிக்கையிலிருந்து பயனர் முகவர் மற்றும் ஏற்கும் புலங்களையும் அகற்றுவோம் - அவை எதையும் பாதிக்காது. எனவே, தொடங்குவோம். ஸ்கிரிப்ட் செயல்படுத்தப்பட்டது, ஆனால் பொக்கிஷமான HTML ஆவணம் எங்கே? எதிர்பார்க்க அதை சாப்பிட்டேன். அவரை துப்புவதற்கு, நீங்கள் வைக்க வேண்டும்:

set results $expect_out(buffer)

ஸ்கிரிப்ட் முடிவதற்கு முன் - இயங்கக்கூடியவற்றின் வெளியீடு இப்படித்தான் எழுதப்படும் எதிர்பார்க்கஓம் கட்டளை மற்றும் திரையில் காட்டப்படும். சுருக்கமாக, இது போன்ற ஒன்று:

ஒரு ஸ்கிரிப்டை எதிர்பார்க்கலாம்

#!/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 வழியாக சேவையகத்திலிருந்து ஒரு தளப் பக்கத்தைக் கோரும் மற்றொரு ஸ்கிரிப்டை உருவாக்குகிறது. பின்னர் கடைசி ஸ்கிரிப்ட்டின் வெளியீட்டை ஒரு கோப்பிற்கு திருப்பி விடுகிறோம், பழைய முறையில் அதை அனுப்புகிறோம். "வடிப்பான்கள்" கூடுதல் சதுரங்கள் மற்றும் அவற்றை கோப்பில் எழுதவும்.

பலவற்றின் குறுக்குவெட்டு. கீழ் வரி

உண்மையில், இதுவே குறைவான பிரச்சனைகளை ஏற்படுத்துகிறது. இரண்டு சொற்களுக்கு மேலே உள்ள நடைமுறைகளை நாங்கள் மேற்கொள்கிறோம், பின்னர் இரண்டு பட்டியல்களிலிருந்தும் ஒவ்வொரு வார்த்தையையும் ஒவ்வொன்றுடன் ஒப்பிட்டு, ஒரு பொருத்தம் கண்டறியப்பட்டால், அதை வெளியிடுகிறோம். இப்போது எங்களிடம் ஒரு ஸ்கிரிப்ட் உள்ளது, இது இரண்டு சொற்களை உள்ளீடாக எடுத்து, இரண்டையும் ரைம் செய்யும் சொற்களின் பட்டியலைக் காண்பிக்கும், மேலும் கணக்கீடுகளைக் கூட கணக்கில் எடுத்துக் கொள்ளாமல், நான்கு தாவல்களுக்கு இடையில் கைமுறையாக மாறாமல், “கண்ணால்” வார்த்தைகளை நினைவில் வைத்துக் கொள்ளாமல் - அனைத்தும் சேகரிக்கப்பட்டு, கணக்கிடப்படுகின்றன. மற்றும் தானாகவே நிராகரிக்கப்பட்டது. அற்புதம்.

இந்த வெளியீட்டின் நோக்கம் ஒருவருக்கு ஏதாவது தேவைப்பட்டால், அவர் அதை எப்படியும் செய்வார் என்பதைக் காட்டுவதாகும். மிகவும் பயனற்றது, வளைந்த, தவழும், ஆனால் அது வேலை செய்யும்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்