สมองของนักเรียนที่เรียนรู้เกี่ยวกับโลกคอมพิวเตอร์มีความสามารถอะไร

วันที่ดี

หลังจากเขียนสคริปต์อื่นใน Bash เสร็จแล้วฉันก็รู้ว่าทุกอย่างควรแตกต่างไปจากเดิมอย่างสิ้นเชิง แต่ทุกอย่างก็ใช้ได้ ฉันต้องการแสดงให้คุณเห็นว่าฉันเขียนคำหยาบคายและไม้ค้ำยันอะไรเพื่อแก้ไขปัญหา แต่ยังไม่มีเกวียนความรู้ กล่าวอีกนัยหนึ่งคือภาพล้อเลียนของการเขียนโปรแกรม

งาน


มีบางสิ่งที่จำเป็นในการ:

  • แสดงคำคล้องจองมากมาย ยกเว้นช่องสี่เหลี่ยม
  • ข้ามคำคล้องจองมากมายของสองคำ

เพื่ออะไร? แค่นั้นแหละ - และนั่นล่ะ
ใครไม่รู้สัมผัสสี่เหลี่ยม (ในสำนวนทั่วไป - สี่เหลี่ยม) คือคำสองคำที่มีตัวอักษรสองตัวสุดท้ายในการสะกดตรงกันซึ่ง (บ่อยครั้งนี่คือสิ่งเดียว) ทำให้พวกเขาคล้องจอง ตัวอย่างเช่น ดอกกุหลาบมีอากาศหนาวจัด ยาง-รถ. การใช้สี่เหลี่ยมจัตุรัสในรูปแบบสมัยใหม่ไม่ได้รับการอนุมัติจากผู้คนเป็นพิเศษเนื่องจากความดั้งเดิม

การตัดสิน


สำหรับฉันแล้วดูเหมือนว่าทางออกที่ง่ายที่สุดคือการเขียนสคริปต์ใน Bash ที่ใช้เครื่องกำเนิดสัมผัสที่มีอยู่แล้ว - 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

เราดู เราลอง - ทุกอย่างได้ผล... แล้วรายการคำว่า "เล่น" อยู่ที่ไหน? และสำหรับคำว่า "ฉันกำลังไป"? ไฟล์ว่างเปล่า! ทั้งหมดนี้เป็นเพราะคำเหล่านี้เป็นคำกริยา และเรารู้ว่าคำเหล่านี้ทำอะไรกับผู้ที่คล้องจองกับคำกริยา คำกริยาสัมผัสแย่กว่าสัมผัสสี่เหลี่ยมจัตุรัสเพราะภาษารัสเซียมีคำกริยามากที่สุดและทุกคำมีตอนจบเหมือนกันซึ่งเป็นเหตุผลว่าทำไมพวกเขาจึงไม่อยู่ในไฟล์สุดท้ายหลังจากตรวจสอบตอนจบแล้ว

อย่างไรก็ตาม เราไม่รีบร้อน สำหรับแต่ละคำไม่เพียงมีคำคล้องจองเท่านั้น แต่ยังมีความสอดคล้องกันด้วยซึ่งบางครั้งฟังดูดีกว่าสัมผัสกันมาก - นั่นคือเหตุผลว่าทำไมพวกเขาถึงมีความสอดคล้องกัน (ภาษาฝรั่งเศส assonance จากภาษาละติน assono - ฉันฟังดูกลมกลืน)

เราได้รับความสอดคล้อง

นี่คือจุดเริ่มต้นของความสนุก: ความสอดคล้องจะปรากฏใน URL ที่แยกจากกัน และในหน้าเดียวกัน โดยการรันสคริปต์ การส่งคำขอ HTTP และการรับการตอบกลับ ฉันจะพูดได้อย่างไร wget'กดปุ่มหรือยัง? แต่ไม่มีทาง เศร้า.

เมื่อสังเกตเห็นว่า URL ในบรรทัดมีการเปลี่ยนแปลง ฉันจึงคัดลอกสิ่งที่มีอยู่หลังจากเปลี่ยนมาใช้ความสอดคล้องและวางลงในแท็บเบราว์เซอร์ใหม่ - เปิดเพลงคล้องจองที่หนักแน่นขึ้นมา ไม่ว่า.

โดยพื้นฐานแล้ว ฉันคิดว่ามันไม่สำคัญกับเซิร์ฟเวอร์ว่าสคริปต์ที่ส่งคำขอนั้นจะถูกดำเนินการหรือไม่ หรือบุคคลนั้นจะพิมพ์ด้วยมือหรือไม่ ดังนั้น? ใครรู้บ้างลองไปดูกัน

ส่งที่ไหนคะ? จะส่งอะไร? คำขอ HTTP ไปยัง IP ของเซิร์ฟเวอร์ มีบางอย่างเช่น 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.

เฮ้. อิอิอิ แน่นอนว่านั่นคือสิ่งที่ฉันคาดหวังไว้เมื่อส่งคำขอ HTTP เปล่าไปยังพอร์ต HTTPS เราควรเข้ารหัสตอนนี้หรือไม่? ความยุ่งยากทั้งหมดนี้ด้วยคีย์ RSA และ SHA256 ทำไมล่ะ มี OpenSSL สำหรับสิ่งเหล่านี้ เรารู้แล้วว่าต้องทำอย่างไร เราจะลบช่องผู้อ้างอิงและคุกกี้ออกก่อน ฉันคิดว่ามันจะไม่ส่งผลกระทบต่อเรื่องนี้มากนัก:

พูดคุยกับเทอร์มินัล

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? หากคุณสามารถคิดอะไรบางอย่างกับวินาทีที่สองได้ แต่ด้วยครั้งแรก...

เป็นเรื่องดีที่มี Habrที่ฉันอ่านเกี่ยวกับยูทิลิตี้นี้ คาดหวังซึ่งทำให้กระบวนการโต้ตอบกับโปรแกรมที่คาดหวังการโต้ตอบของมนุษย์เป็นไปโดยอัตโนมัติ การมีทีมจะน่าดึงดูดยิ่งขึ้น คาดหวังอัตโนมัติกำเนิด คาดหวัง สคริปต์ตามการกระทำของคุณ เราเปิดตัวทำทั้งหมดนี้และนี่คือสคริปต์ที่เสร็จสมบูรณ์ มีเพียงเขาเท่านั้นที่ใหญ่มากและทั้งหมดเป็นเพราะ OpenSSL แสดงใบรับรอง คีย์ และ คาดหวัง รอคอยผลลัพธ์ของทั้งหมดนี้ เราต้องการสิ่งนี้หรือไม่? เลขที่ เราลบพรอมต์แรกทั้งหมด เหลือเพียงตัวแบ่งบรรทัดสุดท้าย 'r' นอกจากนี้ เรายังลบช่อง User-Agent และ Accept ออกจากคำขอของเราด้วย ซึ่งจะไม่ส่งผลกระทบใดๆ เอาล่ะ มาเปิดตัวกันเลย สคริปต์ถูกดำเนินการแล้ว แต่เอกสาร 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 ที่รับผิดชอบว่าคำใดจะเชื่อมโยงกับความสอดคล้องกัน ปรากฎว่าเราจะค้นหาคำว่า “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” ในภาษา ASCII หรือ “ที่นี่” ใน 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 จากนั้นเราก็เปลี่ยนเส้นทางเอาต์พุตของสคริปต์สุดท้ายไปยังไฟล์และส่งต่อผ่านด้วยวิธีแบบเก่า "ตัวกรอง" สี่เหลี่ยมเพิ่มเติมแล้วเขียนลงในไฟล์

ทางแยกของหลาย ๆ คน บรรทัดล่าง

ที่จริงแล้วนี่คือสิ่งที่ทำให้เกิดปัญหาน้อยที่สุด เราดำเนินการตามขั้นตอนข้างต้นสำหรับคำสองคำ จากนั้นจากสองรายการเราจะเปรียบเทียบแต่ละคำกับแต่ละคำ และหากพบว่าตรงกัน เราจะส่งออกคำนั้น ตอนนี้เรามีสคริปต์ที่รับคำสองคำเป็นอินพุตและแสดงรายการคำที่คล้องจองกับทั้งสองและแม้กระทั่งคำนึงถึงความสอดคล้องกันและทั้งหมดนี้โดยไม่ต้องสลับระหว่างสี่แท็บด้วยตนเองและจดจำคำศัพท์ "ด้วยตา" - ทั้งหมดรวบรวมและคิดแล้ว และทิ้งโดยอัตโนมัติ มหัศจรรย์.

จุดประสงค์ของสิ่งพิมพ์นี้คือเพื่อแสดงให้เห็นว่าหากบุคคลต้องการสิ่งใด เขาก็จะทำสิ่งนั้นอยู่ดี ไม่ได้ผลมาก คดเคี้ยว น่าขนลุกแต่ก็จะได้ผล

ที่มา: will.com

เพิ่มความคิดเห็น