มิถุนายน 2007
บทนำ
การพัฒนาแอปพลิเคชันที่มีการโต้ตอบกับบริการบนเว็บก่อให้เกิดชุดปัญหาเฉพาะ แหล่งที่มาที่พบบ่อยซึ่งสร้างความไม่พอใจคือ ไม่ทราบแน่ชัดว่าข้อความใดที่ส่งไปยังเซิร์ฟเวอร์หรือได้รับการตอบกลับ ข้อบกพร่องบางอย่างที่ทําให้ผู้ใช้ติดตามได้ยากที่สุดเกิดจากการขาดการเชื่อมต่อระหว่างสิ่งที่เราคิดว่าเรากําลังส่งไปยังเซิร์ฟเวอร์และสิ่งที่จะเกิดขึ้นจริง
บทความนี้จะแนะนําเครื่องมือมากมายที่จะช่วยให้ข้อมูลบนสายมองเห็นได้และเป็นประโยชน์มากขึ้น เครื่องมือเหล่านี้เรียกว่า "Sniffer Sniffs" ซึ่งเป็นเครื่องมือแพ็กเก็ตเครือข่ายที่เคลื่อนย้ายข้ามอินเทอร์เฟซเครือข่ายของคุณ การตรวจสอบเนื้อหาของแพ็กเก็ตเหล่านี้และลําดับการส่งและได้รับอาจเป็นเทคนิคการแก้ไขข้อบกพร่องที่มีประโยชน์
เช่น การเรียกดูฟีดสาธารณะ
ฉันต้องการรวมทีมปั่นจักรยานสําหรับการขี่จักรยานเพื่อการกุศล และสร้างปฏิทินสําหรับกิจกรรมต่างๆ เช่น เซสชันข้อมูล งานระดมทุนของทีม และการฝึกซ้อม ฉันกําหนดให้ปฏิทินเป็นแบบสาธารณะเพื่อให้สมาชิกในทีมและนักปั่นคนอื่นๆ ดูปฏิทินและเข้าร่วมกิจกรรมได้ ฉันต้องการส่งจดหมายข่าวพร้อมกิจกรรมที่กําลังจะจัดขึ้นด้วย เพราะฉะนั้นแทนที่จะคัดลอกข้อมูลจากเว็บไซต์ Google ปฏิทิน ฉันใช้ Google ปฏิทิน Data API เพื่อค้นหาปฏิทินนี้และเรียกข้อมูลกิจกรรมได้
เอกสารประกอบของ Google ปฏิทิน API มีข้อมูลเกี่ยวกับวิธีใช้ RESTful Google Data API เพื่อโต้ตอบกับปฏิทินของฉันแบบเป็นโปรแกรม (หมายเหตุของผู้แก้ไข: ตั้งแต่เวอร์ชัน 3 เป็นต้นไป Google ปฏิทิน API จะไม่ใช้รูปแบบข้อมูลของ Google อีกต่อไป) ขั้นตอนแรกที่ต้องทําคือการรับ URL ของฟีดกิจกรรมในปฏิทินโดยคลิกปุ่ม ในหน้าการตั้งค่าปฏิทิน
http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic
เมื่อใช้เอกสารประกอบของ Google ปฏิทินเป็นการอ้างอิง ฉันจะเรียกข้อมูลและแสดงกิจกรรมในปฏิทินลักษณะนี้ได้ โดย PUBLIC_FEED_URL
จะเก็บ URL ของฟีดกิจกรรม
CalendarService myService = new CalendarService("exampleCo-fiddlerExample-1"); final String PUBLIC_FEED_URL = "http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic"; URL feedUrl = new URL(PUBLIC_FEED_URL); CalendarEventFeed resultFeed = myService.getFeed(feedUrl, CalendarEventFeed.class); System.out.println("All events on your calendar:"); for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEventEntry entry = resultFeed.getEntries().get(i); System.out.println("\t" + entry.getTitle().getPlainText()); } System.out.println();
การดําเนินการนี้จะแสดงรายการพื้นฐานของกิจกรรมในปฏิทิน
All events on your calendar: MS150 Training ride Meeting with Nicole MS150 Information session
ข้อมูลโค้ดด้านบนจะแสดงชื่อกิจกรรมในปฏิทิน แต่ข้อมูลที่เหลือที่เราได้รับจากเซิร์ฟเวอร์เป็นอย่างไร ไลบรารีของไคลเอ็นต์ Java ไม่ได้ทําให้เอาต์พุตฟีดหรือรายการเป็น XML เป็นเรื่องง่าย และแม้จะเป็นเช่นนั้น XML ก็ไม่ใช่เรื่องราวทั้งหมด ส่วนหัว HTTP ที่มาพร้อมกับคําขอมีอะไรบ้าง การค้นหามีการพร็อกซีหรือมีการเปลี่ยนเส้นทางไหม ด้วยการดําเนินการที่ซับซ้อนมากขึ้น คําถามเหล่านี้จึงมีความสําคัญมากขึ้นเรื่อยๆ โดยเฉพาะอย่างยิ่งเมื่อมีข้อผิดพลาดเกิดขึ้นและเราได้รับข้อผิดพลาด ซอฟต์แวร์ดักจับแพ็กเก็ตจะตอบคําถามเหล่านี้ได้ด้วยการเปิดเผยการจราจรของข้อมูลในเครือข่าย
tcpdump
tcpdump เป็นเครื่องมือบรรทัดคําสั่งที่ทํางานบนแพลตฟอร์มที่มีลักษณะเหมือน Unix แต่ก็มีพอร์ต Windows ชื่อว่า WinDump ด้วย tcpdump จะตั้งการ์ดเครือข่ายเป็นโหมดเฉพาะซึ่งต้องใช้สิทธิ์ผู้ใช้ขั้นสูง เช่นเดียวกับโปรแกรมดักจับแพ็กเก็ตส่วนใหญ่ หากต้องการใช้ tcpdump ให้ระบุอินเทอร์เฟซเครือข่ายเพื่อฟังการใช้งาน แล้วการรับส่งข้อมูลเครือข่ายจะส่งไปที่ stdout ดังนี้
sudo tcpdump -i eth0
หากเรียกใช้คําสั่งนี้ ระบบจะจํากัดการรับส่งข้อมูลในเครือข่ายทุกประเภท ซึ่งบางเหตุการณ์จะไม่รู้จักเหตุการณ์ คุณส่งต่อเอาต์พุตไปยังไฟล์และจัดเรียงภายหลังได้ แต่อาจนําไปสู่ไฟล์ขนาดใหญ่มากบางไฟล์ ซอฟต์แวร์บันทึกแพ็กเก็ตส่วนใหญ่มีกลไกการกรองในตัวในตัว คุณจึงบันทึกเฉพาะสิ่งที่ต้องการได้
tcpdump รองรับการกรองตามลักษณะเฉพาะต่างๆ ของการจราจรของข้อมูลในเครือข่าย เช่น การบอกให้ tcpdump บันทึกเฉพาะการรับส่งข้อมูลไปยังหรือจากเซิร์ฟเวอร์ของคุณในพอร์ต 80 (ข้อความ HTTP) โดยใส่ชื่อโฮสต์ของเซิร์ฟเวอร์ลงในนิพจน์ต่อไปนี้
dst or src host <hostname> and port 80
สําหรับแต่ละแพ็กเก็ตที่ตรงกับนิพจน์ตัวกรอง tcpdump จะแสดงการประทับเวลา แหล่งที่มาและปลายทางของแพ็กเก็ต รวมไปถึงแฟล็ก TCP หลายรายการ ข้อมูลนี้คุ้มค่าเพราะแสดงลําดับที่รับและส่งแพ็กเก็ต
การดูเนื้อหาของแพ็กเก็ตก็เป็นประโยชน์เช่นกัน แฟล็ก "-A" จะบอก tcpdump ให้พิมพ์แต่ละแพ็กเก็ตใน ASCII ทําให้มองเห็นส่วนหัว HTTP และเนื้อความ แฟล็ก "-s" จะใช้เพื่อระบุจํานวนไบต์ที่จะแสดง (โดยที่ "-s 0" หมายถึงไม่ตัดส่วนเนื้อหาของข้อความเลย)
เมื่อนําทุกอย่างมารวมกัน เราจะได้รับคําสั่งต่อไปนี้
sudo tcpdump -A -s 0 -i eth0 dst or src host <hostname> and port 80
หากเรียกใช้คําสั่งนี้ แล้วเรียกใช้ตัวอย่าง .Java แบบสั้นด้านบน คุณจะเห็นการสื่อสารของเครือข่ายทั้งหมดที่เกี่ยวข้องกับการดําเนินการนี้ ในการเข้าชม คุณจะเห็นคําขอ HTTP GET
ดังนี้
22:22:30.870771 IP dellalicious.mshome.net.4520 > po-in-f99.google.com.80: P 1:360(359) ack 1 win 65535 E.....@....\...eH..c...P.=.....zP......GET /calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic HTTP/1.1 User-Agent: exampleCo-fiddlerExample-1 GCalendar-Java/1.0.6 GData-Java/1.0.10(gzip) Accept-Encoding: gzip Cache-Control: no-cache Pragma: no-cache Host: www.google.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive
และคุณจะเห็นข้อความตอบกลับ 200 OK
ที่มีฟีดข้อมูล Google ด้วย โปรดสังเกตว่าฟีดแบ่งออกเป็น 4 แพ็กเก็ต ดังนี้
22:22:31.148789 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1:1431(1430) ack 360 win 6432 E...1 ..2.I.H..c...e.P.....z.=.:P..M...HTTP/1.1 200 OK Content-Type: application/atom+xml; charset=UTF-8 Cache-Control: max-age=0, must-revalidate, private Last-Modified: Mon, 11 Jun 2007 15:11:40 GMT Transfer-Encoding: chunked Date: Sun, 24 Jun 2007 02:22:10 GMT Server: GFE/1.3 13da <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gCal='http://sc hemas.google.com/gCal/2005' xmlns:gd='http://schemas.google.com/g/2005'><id>http ://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo gle.com/public/basic</id><updated>2007-06-11T15:11:40.000Z</updated><category sc heme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2 005#event'></category><title type='text'>MS150 Training Schedule</title><subtitl e type='text'>This calendar is public</subtitle><link rel='http://schemas.google .com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/calend ar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic'></ link><link rel='self' type='application/atom+xml' href='http://www.google.com/ca lendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic ?max-results=25'></link><author><name>Lane LiaBraaten</name><email>api.lliabraa@ gmail.com</email></author><generator version='1.0' uri='http://www.google.com/ca lendar'>Google Calendar</generator><openSearch:totalRe 22:22:31.151501 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1431:2861(1430) ack 360 win 6432 E...1!..2.I.H..c...e.P.......=.:P.. 2...sults>3</openSearch:totalResults><openSe arch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch :itemsPerPage><gd:where valueString=''></gd:where><gCal:timezone value='America/ Los_Angeles'></gCal:timezone><entry><id>http://www.google.com/calendar/feeds/24v j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j 740hnj46744</id><published>2007-06-11T15:11:05.000Z</published><updated>2007-06- 11T15:11:05.000Z</updated><category scheme='http://schemas.google.com/g/2005#kin d' term='http://schemas.google.com/g/2005#event'></category><title type='text'>M S150 Training ride</title><summary type='html'>When: Sat Jun 9, 2007 7am to 10am &nbsp; PDT<br> <br>Event Status: confirmed</summary><conte nt type='text'>When: Sat Jun 9, 2007 7am to 10am&nbsp; PDT<br> <b r>Event Status: confirmed</content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/event?eid=ZGd0NDAwMjJjdWkyazNqNzQwaG5qNDY3 NDQgMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw' title='alternate'></link><link rel=' self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/24v j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j 740hnj46744'></link><author><name>MS150 Training Schedule</name></author><gCal:s endEventNotifications value='false'></gCal:sendEventNotifications></entry><entry ><id>http://www.google.com/cal 22:22:31.153097 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 2861:4291(1430) ack 360 win 6432 E...1#..2.I.H..c...e.P.......=.:P.. ....endar/feeds/24vj3m5pl125bh2ijbbneh953s%4 0group.calendar.google.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8</id><publishe d>2007-06-11T15:08:23.000Z</published><updated>2007-06-11T15:10:39.000Z</updated ><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.g oogle.com/g/2005#event'></category><title type='text'>Meeting with Nicole</title ><summary type='html'>When: Mon Jun 4, 2007 10am to 11am&nbsp; PDT<br> <br>Where: Conference Room B <br>Event Status: confirmed</summ ary><content type='text'>When: Mon Jun 4, 2007 10am to 11am&nbsp; PDT<br& gt; <br>Where: Conference Room B <br>Event Status: confirmed <br>Event Description: Discuss building cycling team for MS150</content><l ink rel='alternate' type='text/html' href='http://www.google.com/calendar/event? eid=NTFkOGtoNHMzYnBscW5iZjFscDZwMGtqcDggMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw' title='alternate'></link><link rel='self' type='application/atom+xml' href='http ://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo gle.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8'></link><author><name>MS150 Trai ning Schedule</name></author><gCal:sendEventNotifications value='false'></gCal:s endEventNotifications></entry><entry><id>http://www.google.com/calendar/feeds/24 vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/va41amq3r08dhh kpm3lc1abs2o</id><published>20 22:22:31.190244 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: P 4291:5346(1055) ack 360 win 6432 E..G1$..2.K.H..c...e.P.....<.=.:P.. ....07-06-11T15:10:08.000Z</published><updat ed>2007-06-11T15:10:08.000Z</updated><category scheme='http://schemas.google.com /g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title ty pe='text'>MS150 Information session</title><summary type='html'>When: Wed Jun 6, 2007 4pm to Wed Jun 6, 2007 5pm&nbsp; PDT<br> <br>Event Statu s: confirmed</summary><content type='text'>When: Wed Jun 6, 2007 4pm to Wed Jun 6, 2007 5pm&nbsp; PDT<br> <br>Event Status: confirmed< /content><link rel='alternate' type='text/html' href='http://www.google.com/cale ndar/event?eid=dmE0MWFtcTNyMDhkaGhrcG0zbGMxYWJzMm8gMjR2ajNtNXBsMTI1YmgyaWpiYm5la Dk1M3NAZw' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.c alendar.google.com/public/basic/va41amq3r08dhhkpm3lc1abs2o'></link><author><name >MS150 Training Schedule</name></author><gCal:sendEventNotifications value='fals e'></gCal:sendEventNotifications></entry></feed>
เอาต์พุตนี้ ได้แก่ ส่วนหัวและเนื้อหา HTTP ทั้งหมด รวมถึงแฟล็ก TCP ที่เข้ารหัสหลายรายการ ข้อมูลทั้งหมดมีให้บริการที่นี่ แต่อ่านและทําความเข้าใจได้ยาก มีเครื่องมือกราฟิกหลายรายการที่ช่วยให้คุณดูข้อมูลนี้ได้ง่ายขึ้น
WireShark (เดิมคือ Ethereal)
![การจับภาพหน้าจอ Wireshark](https://developers-dot-devsite-v2-prod.appspot.com/static/gdata/articles/support/otw/wireshark2.png?authuser=19&hl=th)
WireShark แสดงการจราจรของข้อมูลในเครือข่ายได้หลายวิธี
WireShark เป็นเครื่องมือกราฟิกที่สร้างด้วย libpcap ซึ่งเป็นไลบรารีเดียวกันกับที่ tcpdump สร้างขึ้น และพร้อมใช้งานใน Linux, Mac OS X และ Windows GUI ของ WireShark ช่วยให้สามารถตีความและโต้ตอบกับข้อมูลการบันทึกแพ็กเก็ตได้หลายวิธี ตัวอย่างเช่น เมื่อมีการบันทึกแพ็กเก็ตจากอินเทอร์เฟซเครือข่าย แพ็กเกตจะแสดงเป็นสีต่างๆ ตามโปรโตคอลที่ใช้อยู่ นอกจากนี้ คุณยังจัดเรียงการเข้าชมตามการประทับเวลา แหล่งที่มา ปลายทาง และโปรโตคอลได้ด้วย
หากคุณเลือกแถวในรายการแพ็กเก็ต Wireshark จะแสดง IP, TCP และข้อมูลเฉพาะโปรโตคอลอื่นๆ ในส่วนหัวของแพ็กเก็ตในแผนผังที่มนุษย์อ่านได้ ข้อมูลยังจะแสดงใน HEX และ ASCII ที่ด้านล่างของหน้าจอด้วย
แม้ว่าลักษณะภาพของ WireShark จะทําให้การจราจรของข้อมูลในเครือข่ายเข้าใจง่ายขึ้น แต่ส่วนใหญ่คุณยังคงต้องกรองการจราจรของข้อมูลในเครือข่าย WireShark มีความสามารถในการกรองที่มีประสิทธิภาพ ซึ่งรวมถึงการรองรับโปรโตคอลหลายร้อยรายการ
เคล็ดลับ: หากต้องการดูโปรโตคอลที่มีอยู่และสร้างตัวกรองที่ซับซ้อน ให้คลิกปุ่ม ใกล้กับด้านบนของหน้าต่าง WireShark
หากต้องการสร้างตัวกรองใหม่ที่ใช้ในตัวอย่าง tcpdump ด้านบน คุณแทรกนิพจน์ต่อไปนี้ลงในช่องตัวกรอง WireShark ได้
ip.addr==<your IP address> && tcp.port==80
หรือใช้ประโยชน์จากความรู้เรื่อง HTTP ของ WireShark ดังนี้
ip.addr==<your IP address> && http
การดําเนินการนี้จะกรองผลการบันทึกเฉพาะแพ็กเก็ตที่เกี่ยวข้องกับการโต้ตอบกับเซิร์ฟเวอร์ Google ปฏิทินนี้ คุณคลิกแพ็กเก็ตแต่ละรายการเพื่อดูเนื้อหาและรวมธุรกรรมเข้าด้วยกันได้
เคล็ดลับ: คุณสามารถคลิกขวาที่แพ็กเก็ตรายการหนึ่ง แล้วเลือก "ติดตามสตรีม TCP" เพื่อแสดงคําขอและการตอบกลับตามลําดับในหน้าต่างเดียว
WireShark ช่วยให้คุณบันทึกข้อมูลการจับภาพได้หลายวิธี คุณสามารถบันทึกแพ็กเก็ต 1 รายการ บางรายการ หรือทั้งหมด หากกําลังดูสตรีม TCP คุณสามารถคลิกปุ่ม "บันทึกเป็น" เพื่อบันทึกเฉพาะแพ็กเก็ตที่เกี่ยวข้องเท่านั้น คุณยังนําเข้าเอาต์พุตจากจับภาพ tcpdump และดูใน WireShark ได้ด้วย
ปัญหา: SSL และการเข้ารหัส
ข้อบกพร่องที่พบบ่อยของเครื่องมือบันทึกแพ็กเก็ตคือความสามารถในการดูข้อมูลที่เข้ารหัสผ่านการเชื่อมต่อ SSL ตัวอย่างข้างต้นเข้าถึงฟีดสาธารณะ ดังนั้นจึงไม่จําเป็นต้องใช้ SSL แต่หากตัวอย่างเข้าถึงฟีดส่วนตัว ไคลเอ็นต์จะต้องตรวจสอบสิทธิ์กับบริการตรวจสอบสิทธิ์ของ Google ซึ่งต้องมีการเชื่อมต่อ SSL
ข้อมูลโค้ดต่อไปนี้คล้ายกับตัวอย่างก่อนหน้านี้ แต่ในที่นี้ CalendarService
จะขอฟีดเมตาปฏิทินของผู้ใช้ ซึ่งเป็นฟีดส่วนตัวที่ต้องมีการตรวจสอบสิทธิ์ หากต้องการตรวจสอบสิทธิ์ เพียงเรียกเมธอด setUserCredentials
วิธีนี้จะทริกเกอร์คําขอ HTTPS ไปยังบริการ ClientLogin และดึงโทเค็นการตรวจสอบสิทธิ์ออกจากการตอบกลับ จากนั้นออบเจ็กต์ CalendarService
จะรวมโทเค็นการตรวจสอบสิทธิ์ในคําขอที่ตามมาทั้งหมด
CalendarService myService = new CalendarService("exampleCo-fiddlerSslExample-1"); myService.setUserCredentials(username, userPassword); final String METAFEED_URL = "http://www.google.com/calendar/feeds/default"; URL feedUrl = new URL(METAFEED_URL); CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class); System.out.println("Your calendars:"); for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEntry entry = resultFeed.getEntries().get(i); System.out.println("\t" + entry.getTitle().getPlainText()); } System.out.println();
พิจารณาการจราจรของข้อมูลในเครือข่ายที่จําเป็นในการตรวจสอบสิทธิ์และเข้าถึงฟีด Google Data API ส่วนตัว
- ส่งข้อมูลเข้าสู่ระบบของผู้ใช้ไปยังบริการ ClientLogin
- ส่ง HTTP
POST
ไปยัง https://www.google.com/accounts/ClientLogin ด้วยพารามิเตอร์ต่อไปนี้ในส่วนเนื้อหาของข้อความ- อีเมล - อีเมลของผู้ใช้
- Passwd - รหัสผ่านของผู้ใช้
- source - ระบุแอปพลิเคชันไคลเอ็นต์ ควรอยู่ในรูปแบบ companyName-applicationName-versionID โดยตัวอย่างจะใช้ชื่อ ExampleCo-FiddlerSSLExample-1
- service - ชื่อบริการ Google ปฏิทินคือ "cl"
- ส่ง HTTP
- รับโทเค็นการให้สิทธิ์
- หากคําขอการตรวจสอบสิทธิ์ล้มเหลว คุณจะได้รับรหัสสถานะ HTTP 403 Forbidden
- หากสําเร็จ การตอบสนองจากบริการจะเป็นรหัสสถานะ HTTP 200 OK รวมถึงรหัสตัวอักษรและตัวเลขยาว 3 รหัสในส่วนเนื้อหาของการตอบกลับ:
SID
,LSID
และAuth
ค่าAuth
คือโทเค็นการให้สิทธิ์
- ขอเมตาแท็กปฏิทินส่วนตัว
- ส่ง HTTP
GET
ไปยัง http://www.google.com/calendar/feeds/default ด้วยส่วนหัวต่อไปนี้
Authorization: GoogleLogin auth=<yourAuthToken>
- ส่ง HTTP
ลองเรียกใช้ข้อมูลโค้ดนี้และดูการจราจรของข้อมูลในเครือข่ายใน WireShark (โดยใช้ "http || ssl" เป็นตัวกรอง) คุณจะเห็นแพ็กเก็ต SSL และ TLS ที่เกี่ยวข้องในธุรกรรม แต่แพ็กเก็ตคําขอ ClientLogin และการตอบกลับจะได้รับการเข้ารหัสในแพ็กเก็ต "ข้อมูลแอปพลิเคชัน" ไม่ต้องกังวล ขั้นต่อไป เราจะมาดูเครื่องมือที่สามารถเปิดเผยข้อมูลที่เข้ารหัสนี้
Fiddler
Fiddler เป็นอุปกรณ์สแกนแพ็กเก็ตกราฟิกอีกแบบ แต่ทํางานต่างจากเครื่องมือที่นําเสนอจนถึงตอนนี้ Fiddler ทําหน้าที่เป็นพร็อกซีระหว่างแอปพลิเคชันของคุณและบริการระยะไกลที่คุณโต้ตอบด้วยอยู่ โดยจะกลายเป็นบริการแบบแทรกกลางการสื่อสาร Fiddler จะสร้างการเชื่อมต่อ SSL กับทั้งแอปพลิเคชันและบริการเว็บระยะไกลของคุณ การถอดรหัสการรับส่งข้อมูลจากปลายทางเดียว บันทึกข้อความธรรมดา และเข้ารหัสการเข้าชมใหม่ก่อนส่ง ขออภัย Fiddler พร้อมให้บริการสําหรับ Windows ที่ขออภัยแก่ผู้ใช้ Mac และ Linux ทุกคนเท่านั้น
หมายเหตุ: การรองรับ SSL ต้องใช้ Fiddler เวอร์ชัน 2 และ .NET Framework เวอร์ชัน 2.0
คุณดูการเข้าชมจากเครือข่ายใน Fiddler ได้ผ่านแท็บเครื่องมือตรวจสอบเซสชัน แท็บย่อยที่มีประโยชน์มากที่สุดสําหรับการแก้ไขข้อบกพร่องเกี่ยวกับ Google Data API มีดังนี้
- ส่วนหัว - แสดงส่วนหัว HTTP ในรูปแบบต้นไม้ที่ยุบได้
- การตรวจสอบสิทธิ์ - แสดงส่วนหัวการตรวจสอบสิทธิ์
- ข้อมูลดิบ - แสดงเนื้อหาของแพ็กเก็ตเครือข่ายในข้อความ ASCII
เคล็ดลับ: คลิกไอคอน ที่มุมซ้ายล่างของหน้าต่าง Fiddler เพื่อเปิดและปิดการจับภาพ
Fiddler ใช้ .NET Framework เพื่อกําหนดค่าการเชื่อมต่อเครือข่ายเพื่อใช้ Fiddler เป็นพร็อกซี ซึ่งหมายความว่าการเชื่อมต่อใดๆ ที่คุณทําใน Internet Explorer หรือรหัส .NET จะปรากฏใน Fiddler โดยค่าเริ่มต้น อย่างไรก็ตาม การเข้าชมจากตัวอย่าง Java ด้านบนจะไม่แสดงเนื่องจาก Java มีวิธีการตั้งค่าพร็อกซี HTTP ด้วยวิธีอื่น
ใน Java คุณสามารถตั้งค่าพร็อกซี HTTP โดยใช้พร็อพเพอร์ตี้ของระบบ Fiddler ทํางานบนพอร์ต 8888 ดังนั้นสําหรับการติดตั้งในเครื่อง คุณทําให้โค้ด Java ใช้งาน Fiddler เป็นพร็อกซีสําหรับ HTTP และ HTTPS ได้โดยการเพิ่มบรรทัดต่อไปนี้
System.setProperty("http.proxyHost", "localhost"); System.setProperty("http.proxyPort", "8888"); System.setProperty("https.proxyHost", "localhost"); System.setProperty("https.proxyPort", "8888");
หากคุณเรียกใช้ตัวอย่างด้วยบรรทัดเหล่านี้ คุณจะได้รับสแต็กเทรซที่น่ารังเกียจจากแพ็กเกจความปลอดภัยของ Java จริงๆ
[java] Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
![การจับภาพหน้าจอ Fiddler](https://developers-dot-devsite-v2-prod.appspot.com/static/gdata/articles/support/otw/fiddler.png?authuser=19&hl=th)
Fiddler จะถอดรหัสและแสดงการรับส่งข้อมูล SSL ได้
ข้อผิดพลาดนี้เกิดขึ้นเมื่อยืนยันใบรับรองที่แสดงผลจากเซิร์ฟเวอร์ในการเชื่อมต่อ SSL ไม่ได้ ในกรณีนี้ ใบรับรองที่ไม่ถูกต้องมาจาก Fiddler ซึ่งทําหน้าที่เป็นคนกลาง Fiddler จะสร้างใบรับรองในทันที และเนื่องจาก Fiddler ไม่ได้เป็นผู้ออกใบรับรองที่เชื่อถือได้ ใบรับรองเหล่านี้จะทําให้ Java ตั้งค่าการเชื่อมต่อ SSL ไม่สําเร็จ
หมายเหตุ: เมื่อ Fiddler ทํางานอยู่ การเชื่อมต่อ SSL ที่คุณทําใน Internet Explorer จะเรียกใช้ "การแจ้งเตือนความปลอดภัย" ถามว่าคุณต้องการดําเนินการต่อหรือไม่แม้จะมีใบรับรองคร่าวๆ คุณสามารถคลิก "ดูใบรับรอง" เพื่อดูใบรับรองที่ Fiddler สร้างขึ้น
แล้วคุณจะหลีกเลี่ยงข้อยกเว้นด้านความปลอดภัยนี้ได้อย่างไร โดยทั่วไปแล้ว คุณต้องกําหนดค่าเฟรมเวิร์กความปลอดภัยของ Java อีกครั้งเพื่อให้เชื่อถือใบรับรองทั้งหมด แต่โชคดีที่คุณจะไม่ต้องพลิกโฉมล้อดูที่หัวข้อโซลูชันของ Francis Labrie และเพิ่มเมธอด SSLUtilities.trustAllHttpsCertificates()
ไปยังตัวอย่างข้างต้น
เมื่อกําหนดค่า Java ให้ใช้ Fiddler เป็นพร็อกซีและปิดใช้การยืนยันใบรับรองเริ่มต้นแล้ว คุณจะเรียกใช้ตัวอย่างและดูการรับส่งข้อมูลทั้งหมดที่ส่งผ่านข้อความธรรมดาได้ อย่าขโมยรหัสผ่านของฉัน
โปรดทราบว่าธุรกรรมการตรวจสอบสิทธิ์นี้เป็นเพียงตัวอย่างเล็กๆ ของการเข้าชม SSL เว็บแอปพลิเคชันบางแห่งใช้การเชื่อมต่อ SSL โดยเฉพาะ ดังนั้นการแก้ไขข้อบกพร่องการเข้าชม HTTP จะไม่เกิดขึ้นจากคําถามโดยไม่ได้ถอดรหัสข้อมูล
บทสรุป
tcpdump มีให้บริการบน Linux, Mac OS X และ Windows และเป็นเครื่องมือที่ยอดเยี่ยมเมื่อคุณรู้ว่ากําลังมองหาสิ่งที่ต้องการและเพียงแค่จับภาพได้อย่างรวดเร็ว อย่างไรก็ตาม มีเครื่องมือกราฟิกที่แสดงการเข้าชมเครือข่ายในรูปแบบที่เข้าใจง่ายขึ้น โดย tcpdump มีตัวเลือกและความสามารถในการกรองมากกว่าตัวเลือกที่เรากล่าวถึงที่นี่ สําหรับคําอธิบายฟังก์ชันทั้งหมดของ tcpdump ให้พิมพ์ 'man tcpdump' หรือไปที่หน้า tcpdump man ออนไลน์
WireShark มีให้บริการใน Linux, Mac OS X และ Windows การรองรับโปรโตคอลหลายร้อยรายการในตัวทําให้ WireShark เป็นเครื่องมือที่มีประโยชน์สําหรับแอปพลิเคชันจํานวนมาก ไม่ใช่แค่การแก้ไขข้อบกพร่อง HTTP บทนํานี้แทบจะเป็นรอยขีดข่วนของความสามารถต่างๆ ของ WireShark หากต้องการข้อมูลเพิ่มเติม ให้พิมพ์ "manเนื้อหาฉลาม" หรือไปที่เว็บไซต์ WireShark
นอกจากนี้ Fiddler มีฟีเจอร์ที่ยอดเยี่ยมมากมาย แต่สิ่งที่ทําให้ฟีเจอร์นี้แตกต่างก็คือความสามารถในการถอดรหัสการเข้าชม SSL ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ Fiddler2
แอปพลิเคชันดักหาแพ็คเก็ตเหล่านี้เป็นเครื่องมืออันยอดเยี่ยมที่ต้องมีในกระเป๋าเครื่องมือ และผู้อ่านที่สังเกตการณ์จะสังเกตว่าเครื่องมือเหล่านี้ให้บริการฟรี ครั้งต่อไปที่คุณทํางานกับ Google API และเจอสิ่งที่ดูน่าสงสัย ให้ดึงเครื่องมือวิเคราะห์เครือข่ายอันใดอันหนึ่งออกและดูรายละเอียดเพิ่มเติม หากไม่พบปัญหา คุณสามารถโพสต์คําถามไปยังกลุ่มสนทนาได้เสมอ การรวมข้อความของเครือข่ายที่เกี่ยวข้องจะช่วยให้ผู้อื่นเข้าใจและวินิจฉัยปัญหาของคุณโดยเฉพาะ
ขอให้โชคดีและดมให้สนุกนะ