Skip to content

คนไทยมองโลก

แปลบทความดีเด่นเพื่อคนไทยในอุดมคติอันสูงส่ง

Menu
  • Sample Page
Menu

ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต

Posted on มกราคม 15, 2023

ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต

คุณเคยให้ใครยืมของบางอย่างแล้วคืนให้คุณในสถานะอื่นหรือไม่?

ฉันเห็นสถานการณ์ที่แน่นอนนี้เกิดขึ้นในที่ทำงานในสัปดาห์นี้ ผู้ใช้รายงานว่าเมธอด SDK ซึ่งเกี่ยวข้องกับลำดับการเรียก API ล้มเหลวหลังจากการเรียกครั้งแรก การตรวจสอบพบว่าไคลเอนต์ HTTP ที่ใช้โดย SDK กำลังแก้ไขวัตถุส่วนหัวที่แชร์ระหว่างการเรียก API อย่างเงียบ ๆ

ซอฟต์แวร์ที่เทียบเท่ากับการยืมรถของเพื่อนคุณแล้วส่งคืนพร้อมฮูดสีอื่นอย่างไม่ตั้งใจ

ติส ติส ติ ส.

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

วิธีที่คุณจัดการกับอินพุตมีความสำคัญ


ความแปรปรวนเป็นคุณสมบัติ ไม่ใช่จุดบกพร่อง

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

สำหรับผม บรรทัดล่างคือ:

💡
ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต

นั่นเป็นข้อผิดพลาดที่ไคลเอนต์ HTTP ทำ

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

มีกรณีที่ดีที่จะทำเพื่อไม่กลายพันธุ์วัตถุแม้ว่า การบังคับใช้การเปลี่ยนแปลงไม่ได้ช่วยแก้อาการปวดหัวได้มากเพราะมัน:

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

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

The Sins of Perl มาเยือน โดย Mark-Jason Dominus กล่าวถึงที่มาของคำว่า “การกระทำในระยะไกล”

การ อ่านเกี่ยวกับความปลอดภัยของเธรด จากหลักสูตรการสร้างซอฟต์แวร์ของ MIT มีภาพรวมที่ดีเกี่ยวกับความไม่เปลี่ยนรูป ความปลอดภัยของเธรด และการทำงานพร้อมกัน

NASA’s The Power Of Ten: Rules For Development Safety Critical Code โดย Gerald Holzmann ให้เหตุผลสำหรับการเขียนโปรแกรมเชิงป้องกัน

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

กุญแจสำคัญคือการได้รับ การป้องกัน


เหตุการณ์ที่เกิดขึ้นกับไคลเอนต์ HTTP นั้นทันเวลาสำหรับฉันในทางใดทางหนึ่ง

ฉันได้อ่าน Grokking Simplicity โดย Eric Normand หนังสือเล่มนี้จะกล่าวถึงวิธีการใช้การเขียนโปรแกรมเชิงฟังก์ชัน ในทางปฏิบัติ โดยส่วนใหญ่หลีกเลี่ยงทฤษฎีโดยเน้นไปที่แนวคิดเชิงฟังก์ชันที่สามารถปรับปรุงระบบในโลกแห่งความเป็นจริงได้อย่างไร ก่อนหน้านี้ไม่ถึงสองสัปดาห์ ฉันอ่านหัวข้อเกี่ยวกับ การป้องกันการคัดลอก

นี่คือวิธีที่ทีม SDK จัดการกับปัญหากับไคลเอนต์ HTTP:

💡
การคัดลอกเชิงป้องกัน: การ ทำสำเนาของวัตถุที่เปลี่ยนแปลงได้ก่อนที่จะส่งไปยังหรือหลังจากได้รับจากรหัสที่ไม่น่าเชื่อถือ

ให้ฉันอธิบายความหมายของ รหัสที่ไม่น่าเชื่อถือ

คนมองโลกในแง่ร้ายเชื่อว่ารหัสทั้งหมดไม่น่าเชื่อถือ แต่ข้อสันนิษฐานนั้นใช้ไม่ได้จริงเสมอไปในธุรกิจการเขียนโค้ดแบบวันต่อวัน อย่างน้อยที่สุด ฉันคิดว่าโค้ดที่ไม่น่าเชื่อถือคือโค้ดใดๆ ที่:

  • แสดงพฤติกรรมที่ไม่ดี เช่น ไคลเอ็นต์ HTTP หรือ
  • ไม่สามารถตรวจสอบให้สอดคล้องกับความคาดหวังของคุณ หรือมีค่าใช้จ่ายสูงเกินกว่าจะแก้ไขเพื่อให้เป็นเช่นนั้น ซึ่งมักจะเกิดขึ้นกับรหัสดั้งเดิม

การคัดลอกเชิงป้องกันช่วยในทั้งสองกรณี

นี่คือปัญหาเดียวกันกับที่ทีม SDK เผชิญใน Python:

 >>> headers = {"some_key": "some_value"} >>> response = http_client.get( "/endpoint", headers=headers ) >>> headers {'some_key': 'some_value', 'boo!': 'did\'t expect me, did ya?'}

กุญแจ "boo!" ด้วยค่าตัว "didn't expect me, did ya?" ปรากฏในพจนานุกรม headers โดยไม่คาดคิด เมื่อมีการใช้ headers ในคำขออื่น เนื้อหาที่ไม่คาดคิดจะทำให้คำขอล้มเหลว

หากต้องการใช้การป้องกันการคัดลอกที่นี่ ให้ทำสำเนา headers ก่อนที่จะส่งต่อไปยัง http_client.get() :

 >>> headers = {"some_key": "some_value"} >>> from copy import deepcopy >>> response = http_client.get( "/endpoint", headers=deepcopy(headers) ) # ^^^^^^^^^^^^^^^^^ >>> # / >>> # A copy of `headers` is sent to the client >>> headers {'some_key': 'some_value'}

เนื้อหาของ headers ไม่เปลี่ยนแปลงเนื่องจากสำเนาของ headers ซึ่งเป็นวัตถุที่แตกต่างกันโดยสิ้นเชิงซึ่งสร้างด้วย ฟังก์ชัน deepcopy() ของ Python ถูกส่งไปยังไคลเอนต์แทน

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

การป้องกันการคัดลอกไม่เพียงแค่ปกป้องวัตถุที่ส่งผ่านจากโค้ดของคุณไปยังโค้ดที่ไม่น่าเชื่อถือเท่านั้น นอกจากนี้ยังป้องกันการเปลี่ยนแปลงของวัตถุที่เปลี่ยนแปลงได้ซึ่งส่งผ่านไปยังโค้ดของคุณจากแหล่งที่ไม่น่าเชื่อถือ

พจนานุกรมส่วนหัว เมื่อมองจากมุมมองของไคลเอนต์ HTTP นั้นมาจากโค้ดที่ใช้ API ของไคลเอ็นต์ ซึ่งเป็นตัวอย่างคลาสสิกของโค้ดที่ไม่น่าเชื่อถือ การทำสำเนาของอาร์กิวเมนต์ที่ส่งไปยังไคลเอนต์ก่อนที่จะทำการกลายพันธุ์นั้นจะช่วยทุกคนได้

อาจเป็นเพียงฉัน แต่ดูเหมือนว่าเป็นสิ่งที่ต้องทำด้วยความระมัดระวัง


สิ่งที่ต้องอ่านต่อไป

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

หยุดใช้อินพุตและเอาต์พุตโดยนัย

วิธีง่ายๆ วิธีหนึ่งในการปรับปรุงความสามารถในการทดสอบและการนำกลับมาใช้ใหม่

ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต davidamos.dev เดวิด เอม อส

ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต


เจาะลึก

เรียนรู้เพิ่มเติมเกี่ยวกับการคัดลอกเชิงป้องกันและกลยุทธ์อื่น ๆ ในการบังคับใช้การไม่เปลี่ยนรูปในหนังสือ Grokking Simplicity ของ Eric Normand

เข้าถึงได้ทันทีจาก Manning * หรือซื้อฉบับพิมพ์จาก Amazon *

ห้ามแก้ไขอินพุตโดยไม่ได้รับอนุญาต

* ลิงค์พันธมิตร ดู การเปิดเผยพันธมิตร ของฉันสำหรับข้อมูลเพิ่มเติม


  • A learning a day
  • A Smart Bear
  • AddyOsmani.com
  • AddyOsmani.com (AddyOsmani.com)
  • Adwyat Krishna
  • Adwyat Krishna (Adwyat Krishna)
  • Ahmad Shadeed (Ahmad Shadeed)
  • Alex Turek
  • All That is Solid
  • André Staltz
  • Ars Technica
  • Astral Codex สิบ (Astral Codex Ten)
  • Atoms vs Bits
  • AVC
  • AVC (AVC)
  • Basic Apple Guy
  • Ben Thompson
  • Benedict Evans
  • Blog – storytelling with data
  • Built For Mars
  • Caleb Porzio
  • Christian Heilmann
  • Christian Heilmann (Christian Heilmann)
  • Christopher C
  • Chun Tian (binghe)
  • Codrops
  • Cold Takes
  • Cold Takes (Cold Takes)
  • Daily Infographic
  • Dan Luu
  • Daniel Lemire's blog
  • David Amos
  • David Perell
  • David Walsh Blog
  • Derek Sivers
  • Derek Sivers (Derek Sivers)
  • Desvl
  • Devon's Site
  • Digital Inspiration
  • DKB Blog
  • dropsafe
  • dropsafe (dropsafe)
  • DSHR
  • Dunk
  • DYNOMIGHT
  • eagereyes
  • Endless Metrics
  • Engadget
  • Engadget (Engadget)
  • Entitled Opinions
  • Exception Not Found
  • Experimental History
  • Farnam Street
  • Fed Guy
  • Fed Guy (Fed Guy)
  • Felix Krause
  • Florent Crivello
  • FlowingData
  • FlowingData (FlowingData)
  • Free Mind
  • Full Stack Economics
  • Funny JS
  • Future A16Z
  • Glassnode Insights
  • Glassnode Insights (Glassnode Insights)
  • Hacker News (Hacker News)
  • Hacker News Daily
  • Hacker News Daily (Hacker News Daily)
  • Hacker Noon (Hacker Noon)
  • Harvard Health
  • Harvard Health (Harvard Health)
  • Human Who Codes
  • Hunter Walk
  • Infographics – Cool Infographics
  • Information is Beautiful
  • Irrational Exuberance
  • Jacob Kaplan-Moss
  • Jakob Greenfeld
  • James Sinclair
  • Jason Fried
  • Jeff Kaufman
  • Jeff Kaufman (Jeff Kaufman)
  • Joel on Software
  • John Resig
  • John's internet house
  • Johnny Rodgers
  • Julia Evans
  • Julian.com
  • Kevin Cox
  • Kevin Norman
  • KK – Cool Tools
  • KK – Recomendo
  • KK – The Technium
  • KK – The Technium (KK – The Technium)
  • KK – เครื่องมือสุดเจ๋ง (KK – Cool Tools)
  • KK – แนะนำ (KK – Recomendo)
  • Krishna
  • Lee Robinson
  • Lines and Colors
  • Lyn Alden – Investment Strategy
  • MakeUseOf (MakeUseOf)
  • Martin Fowler
  • Mobilism Forums
  • More To That
  • Morgan Housel
  • Morgan Housel (Morgan Housel)
  • My Super Secret Diary
  • NASA Astronomy Picture
  • Neckar's New Money
  • News Letter
  • Nick Whitaker
  • Nicky's New Shtuff
  • nutcroft
  • Paul Graham
  • Penguin Random House
  • Philip Walton
  • Phoenix's island
  • Pivotal
  • Product Hunt
  • Prof Galloway
  • Psyche
  • Python Weekly
  • Python Weekly (Python Weekly)
  • Quanta Magazine
  • Rachel
  • Rachel (Rachel)
  • Real Life
  • Riccardo Mori
  • Riccardo Mori (Riccardo Mori)
  • Sasha
  • Science & technology
  • Science current issue
  • Scott Hanselman's Blog
  • Sébastien Dubois
  • Sébastien Dubois (Sébastien Dubois)
  • Secretum Secretorum
  • Seth's Blog
  • Shu Ding
  • Sidebar
  • SignalFire
  • Simon Willison's Weblog
  • Simons Foundation
  • Singularity HUB
  • SLIME MOLD TIME MOLD
  • Slyar Home
  • Spencer Greenberg
  • Stay SaaSy
  • Stephen Malina
  • Stephen Wolfram Writings
  • Strange Loop Canon
  • Stratechery
  • Tech Notes
  • TechCrunch
  • TechCrunch (TechCrunch)
  • The Commonplace
  • The Intrinsic Perspective
  • The Latest in Hearing Health | HeardThat
  • The Rabbit Hole
  • The Verge
  • The Verge (The Verge)
  • The Wall Street Journal (The Wall Street Journal)
  • TLDR Newsletter
  • Tom's blog
  • Tomasz Tunguz
  • Tomasz Tunguz (Tomasz Tunguz)
  • Troy Hunt
  • twitter via [email protected] on Inoreader
  • Tychlog
  • Uncharted Territories
  • Visual Capitalist
  • Visual.ly (Visual.ly)
  • Visualising Data
  • Vitalik Buterin
  • Vitalik Buterin (Vitalik Buterin)
  • Weichen Liu
  • What's New
  • Works in Progress
  • Workspaces
  • Writing
  • Xe's Blog
  • xkcd.com
  • xkcd.com (xkcd.com)
  • Yihui Xie
  • Yihui Xie (Yihui Xie)
  • yuzu (yuzu)
  • Zoran Jambor
  • กฤษณะ (Krishna)
  • กลยุทธ์ (Stratechery)
  • การแสดงข้อมูล (Visualising Data)
  • ข้อมูลมีความสวยงาม (Information is Beautiful)
  • ความคิดเห็นที่มีสิทธิ์ (Entitled Opinions)
  • ความอุดมสมบูรณ์อย่างไม่มีเหตุผล (Irrational Exuberance)
  • คัดสรรสมอง (Brain Pickings)
  • จดหมายข่าว (News Letter)
  • จดหมายข่าว TLDR (TLDR Newsletter)
  • จอห์นนี่ ร็อดเจอร์ส (Johnny Rodgers)
  • จาค็อบ แคปแลน-มอสส์ (Jacob Kaplan-Moss)
  • จิตใจ (Psyche)
  • จูเลีย อีแวนส์ (Julia Evans)
  • ชีวิตจริง (Real Life)
  • ซาช่า (Sasha)
  • ดักลาส วาเก็ตตี้ (Douglas Vaghetti)
  • ดินแดนที่ไม่จดที่แผนที่ (Uncharted Territories)
  • ตัวชี้วัดที่ไม่มีที่สิ้นสุด (Endless Metrics)
  • ตากระตือรือร้น (eagereyes)
  • ทรอย ฮันท์ (Troy Hunt)
  • ทวิตเตอร์แปล
  • ทั้งหมดที่เป็นของแข็ง (All That is Solid)
  • ธรรมดา (The Commonplace)
  • นักพัฒนาภาคปฏิบัติ (The Practical Developer)
  • นักเศรษฐศาสตร์ (Enonomist)
  • นักเศรษฐศาสตร์ (The Economist)
  • นักเศรษฐศาสตร์พิมพ์ (Enonomist Print)
  • นายทุนทัศนศิลป์ (Visual Capitalist)
  • นิตยสาร Quanta (Quanta Magazine)
  • บล็อก – การเล่าเรื่องด้วยข้อมูล (Blog – storytelling with data)
  • บล็อก DKB (DKB Blog)
  • บล็อกของ Daniel Lemire (Daniel Lemire's blog)
  • บล็อกของ David Walsh (David Walsh Blog)
  • บล็อกข้อมูล | เดอะการ์เดียน (Datablog | The Guardian)
  • บันทึก Mad Ned (The Mad Ned Memo)
  • บ้านอินเทอร์เน็ตของจอห์น (John's internet house)
  • พอล เกรแฮม (Paul Graham)
  • พื้นฐาน Apple Guy (Basic Apple Guy)
  • พื้นที่ทำงาน (Workspaces)
  • ภาวะเอกฐานฮับ (Singularity HUB)
  • มหึมา (Colossal)
  • มากกว่านั้น (More To That)
  • มาร์ติน ฟาวเลอร์ (Martin Fowler)
  • มีอะไรใหม่ (What's New)
  • มุมมองภายใน (The Intrinsic Perspective)
  • มูลนิธิไซม่อน (Simons Foundation)
  • ยาคอบ กรีนเฟลด์ (Jakob Greenfeld)
  • รูปภาพดาราศาสตร์ของนาซ่า (NASA Astronomy Picture)
  • ล่าสินค้า (Product Hunt)
  • ลิน อัลเดน – กลยุทธ์การลงทุน (Lyn Alden – Investment Strategy)
  • ลูกจันทน์เทศ (nutcroft)
  • วันแห่งการเรียนรู้ (A learning a day)
  • วิทยาศาสตร์ & เทคโนโลยี (Science & technology)
  • วิทยาศาสตร์ปัญหาปัจจุบัน (Science current issue)
  • ศ.กัลโลเวย์ (Prof Galloway)
  • สมาร์ทแบร์ (A Smart Bear)
  • สัญญาณไฟ (SignalFire)
  • หลุมกระต่าย (The Rabbit Hole)
  • อนาคต A16Z (Future A16Z)
  • อะตอมกับบิต (Atoms vs Bits)
  • อาส เทคนิค (Ars Technica)
  • อินโฟกราฟิก – อินโฟกราฟิกสุดเจ๋ง (Infographics – Cool Infographics)
  • อินโฟกราฟิกรายวัน (Daily Infographic)
  • อเล็กซ์ ทูเร็ค (Alex Turek)
  • ฮันเตอร์วอล์ค (Hunter Walk)
  • เงินใหม่ของเนคคาร์ (Neckar's New Money)
  • เจสัน ฟรายด์ (Jason Fried)
  • เดวิด เอมอส (David Amos)
  • เดอะการ์เดียน (Guardian)
  • เดอะการ์เดียน (The Guardian)
  • เทคโนโลยีเสพติด (Engadget)
  • เบน ทอมป์สัน (Ben Thompson)
  • เบเนดิกต์ อีแวนส์ (Benedict Evans)
  • เศรษฐศาสตร์เต็มกอง (Full Stack Economics)
  • เส้นและสี (Lines and Colors)
  • เหวยเฉินหลิว (Weichen Liu)
  • แคนนอนวงแปลก (Strange Loop Canon)
  • แถบด้านข้าง (Sidebar)
  • แรงบันดาลใจดิจิทัล (Digital Inspiration)
  • แอตแลนติก (The Atlantic)
  • โซรัน จัมโบร์ (Zoran Jambor)
  • ใช้ประโยชน์จาก (Make Use Of)
  • ไดอารี่สุดยอดของฉัน (My Super Secret Diary)
  • ไดโนไมท์ (DYNOMIGHT)
  • ไม่พบข้อยกเว้น (Exception Not Found)
  • ไม่มีหมวดหมู่

ทวิตเตอร์แปล

#ยูเครน️ (ค้นหาด้วย Twitter) (#Ukraine️ (Twitter search)) arxivblog (arxivblog) Brett Winton (Brett Winton) Cathie Wood (Cathie Wood) GeekWire (GeekWire) Parag Agrawal (Parag Agrawal) Peter Thiel (Peter Thiel) Steph Smith (Steph Smith) The New York Review of  หนังสือ (The New York Review of Books) Vitalik Buterin (Vitalik Buterin) กีคไวร์ (GeekWire) ช่องของ Durov (Durov's Channel) ทหารเรือ (Naval) ทิมคุก (Tim Cook) ทิม คุก (Tim Cook) นาวาล (Naval) นเรนทรา โมดี (Narendra Modi) บิลเกตส์ (Bill Gates) มาร์ค เกอร์มัน (Mark Gurman) มาร์ค เกอร์แมน (Mark Gurman) สตีฟ สมิธ (Steph Smith) อีลอน มัสก์ (Elon Musk) เคธี่ วูด (Cathie Wood) เบรตต์ วินตัน (Brett Winton) เรย์ ดาลิโอ (Ray Dalio) โจ ไบเดน (Joe Biden) ไวทาลิก บิวเทริน (Vitalik Buterin)

  • กุมภาพันธ์ 2023
  • มกราคม 2023
  • ธันวาคม 2022
  • พฤศจิกายน 2022
  • ตุลาคม 2022
  • กันยายน 2022
  • สิงหาคม 2022
  • กรกฎาคม 2022
  • มิถุนายน 2022
  • พฤษภาคม 2022
  • เมษายน 2022
  • มีนาคม 2022
  • กุมภาพันธ์ 2022
©2023 คนไทยมองโลก | Design: Newspaperly WordPress Theme