On the Wire: Network Capture Tools for API Developers

Lane LiaBraaten، فريق Google Data APIs
يونيو 2007

مقدمة

إنّ تطوير التطبيقات التي تتفاعل مع خدمات الويب يطرح مجموعة فريدة من المشاكل. من الأسباب الشائعة للإحباط عدم معرفة الرسالة التي تم إرسالها إلى الخادم بالضبط، أو الرد الذي تم تلقّيه. بعض الأخطاء الأكثر صعوبة في تتبّعها تحدث بسبب عدم تطابق بين ما نعتقد أنّنا نرسله إلى الخادم وما يتم إرساله فعليًا.

تقدّم هذه المقالة عدة أدوات يمكن أن تساعد في جعل البيانات على الشبكة أكثر وضوحًا وفائدةً. تُعرف هذه الأدوات عادةً باسم "أدوات تتبُّع الحِزم"، وهي تسجّل جميع حِزم الشبكة التي تنتقل عبر واجهة الشبكة. يمكن أن يكون فحص محتويات هذه الحِزم والترتيب الذي تم إرسالها واستلامها به أسلوبًا مفيدًا لتصحيح الأخطاء.

مثال: استرداد خلاصة متاحة للجميع

أعمل على تكوين فريق للدراجات الهوائية للمشاركة في رحلة خيرية، وقد أنشأتُ تقويمًا للأحداث، مثل جلسات المعلومات وفعاليات جمع التبرعات التي ينظّمها الفريق ورحلات التدريب. لقد جعلت هذا التقويم عامًا ليتمكّن أعضاء الفريق وراكبو الدراجات الآخرون من الاطّلاع على التقويم والمشاركة في الأحداث. أريد أيضًا إرسال نشرة إخبارية تتضمّن الأحداث القادمة، لذا بدلاً من نسخ المعلومات من الموقع الإلكتروني لـ "تقويم Google"، يمكنني استخدام واجهة برمجة التطبيقات الخاصة ببيانات "تقويم Google" لطلب البحث في هذا التقويم واسترداد الأحداث.

يتضمّن مستند Google Calendar API معلومات حول كيفية استخدام Google Data API المستند إلى REST للتفاعل مع تقويمي آليًا. (ملاحظة من المحرّر: اعتبارًا من الإصدار 3، لم تعُد واجهة برمجة التطبيقات في "تقويم Google" تستخدم تنسيق "بيانات 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

إذا نفّذت هذا الأمر، ستتلقّى الكثير من الزيارات على الشبكة، ولن تتعرّف على بعضها. يمكنك ببساطة إعادة توجيه الناتج إلى ملف وgrep من خلاله لاحقًا، ولكن قد يؤدي ذلك إلى إنشاء بعض الملفات الكبيرة جدًا. تتضمّن معظم برامج التقاط الحِزم بعض آليات الفلترة المضمّنة حتى لا يتم التقاط سوى ما تحتاج إليه.

تتيح الأداة 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. لاحظ أنّ الخلاصة مقسّمة إلى أربع حِزم:

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

&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;Event Status:     confirmed</summary><conte
nt type='text'>When: Sat Jun 9, 2007 7am to 10am&amp;nbsp; PDT&lt;br&gt;   &lt;b
r&gt;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&amp;nbsp; PDT&lt;br&gt;
  &lt;br&gt;Where: Conference Room B &lt;br&gt;Event Status:     confirmed</summ
ary><content type='text'>When: Mon Jun 4, 2007 10am to 11am&amp;nbsp; PDT&lt;br&
gt;  &lt;br&gt;Where: Conference Room B &lt;br&gt;Event Status:     confirmed

&lt;br&gt;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&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;Event Statu
s:     confirmed</summary><content type='text'>When: Wed Jun 6, 2007 4pm to Wed
Jun 6, 2007 5pm&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;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
تعرض أداة WireShark حركة بيانات الشبكة بعدّة طرق.

WireShark هي أداة رسومية تم إنشاؤها باستخدام libpcap، وهي المكتبة نفسها التي تم إنشاء tcpdump عليها، وتتوفّر على أنظمة التشغيل Linux وMac OS X وWindows. تتيح واجهة المستخدم الرسومية في WireShark عدة طرق جديدة لتفسير بيانات التقاط الحزم والتفاعل معها. على سبيل المثال، عند التقاط حِزم من واجهة الشبكة، يتم عرضها بألوان مختلفة استنادًا إلى البروتوكول الذي تستخدمه. يمكنك أيضًا ترتيب الزيارات حسب الطابع الزمني والمصدر والوجهة والبروتوكول.

إذا اخترت صفًا في قائمة الحِزم، سيعرض Wireshark معلومات IP وTCP وغيرها من المعلومات الخاصة بالبروتوكول في عناوين الحِزم في بنية شجرية قابلة للقراءة. يتم عرض البيانات أيضًا بتنسيق HEX وASCII في أسفل الشاشة.

على الرغم من أنّ طبيعة WireShark المرئية تجعل من السهل فهم حركة بيانات الشبكة، إلا أنّك ستظل بحاجة إلى فلترة حركة بيانات الشبكة في معظم الحالات. يتضمّن WireShark إمكانات فلترة قوية، بما في ذلك التوافق مع مئات البروتوكولات.

ملاحظة: لعرض البروتوكولات المتاحة وإنشاء فلاتر معقّدة، انقر على الزر بالقرب من أعلى نافذة WireShark.

لإعادة إنشاء الفلتر المستخدَم في مثال tcpdump أعلاه، يمكنك إدراج التعبير التالي في مربّع فلتر WireShark:

ip.addr==<your IP address> && tcp.port==80

أو يمكنك الاستفادة من معرفة WireShark ببروتوكول HTTP:

ip.addr==<your IP address> && http

سيؤدي ذلك إلى فلترة نتائج عملية الالتقاط لتشمل فقط الحِزم المتضمّنة في هذا التفاعل مع خادم "تقويم Google". يمكنك النقر على كل حزمة للاطّلاع على المحتوى وتجميع المعاملة.

ملاحظة: يمكنك النقر بزر الماوس الأيمن على إحدى الحِزم واختيار "تتبُّع تدفق TCP" لعرض الطلبات والردود بالتسلسل في نافذة واحدة.

توفّر أداة WireShark عدة طرق لحفظ معلومات الالتقاط. يمكنك حفظ حزمة واحدة أو بعض الحزم أو جميعها. إذا كنت تشاهد بث TCP، يمكنك ببساطة النقر على الزر "حفظ باسم" لحفظ الحِزم ذات الصلة فقط. يمكنك أيضًا استيراد الناتج من عملية التقاط tcpdump وعرضه في WireShark.

مشكلة: طبقة المقابس الآمنة والتشفير

من العيوب الشائعة في أدوات التقاط الحِزم عدم القدرة على عرض البيانات المشفرة عبر اتصال 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:

  1. إرسال بيانات اعتماد المستخدم إلى خدمة ClientLogin
    • أرسِل طلب HTTP POST إلى https://www.google.com/accounts/ClientLogin مع المَعلمات التالية في نص الرسالة:
      • البريد الإلكتروني: عنوان البريد الإلكتروني للمستخدم.
      • Passwd: كلمة مرور المستخدم
      • المصدر: يحدّد تطبيق العميل. يجب أن يكون التنسيق companyName-applicationName-versionID. تستخدِم الأمثلة الاسم ExampleCo-FiddlerSSLExample-1.
      • الخدمة: اسم خدمة "تقويم Google" هو "cl".
  2. تلقّي رمز التفويض
    • في حال تعذُّر طلب المصادقة، ستتلقّى رمز الحالة HTTP 403 Forbidden.
    • في حال نجاح العملية، تكون الاستجابة من الخدمة هي رمز الحالة HTTP 200 OK، بالإضافة إلى ثلاثة رموز أبجدية رقمية طويلة في نص الاستجابة: SID وLSID وAuth. قيمة Auth هي رمز التفويض.
  3. طلب خلاصة وصفية خاصة بالتقويم الخاص
    • أرسِل طلب HTTP GET إلى http://www.google.com/calendar/feeds/default مع العنوان التالي:
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

جرِّب تشغيل هذا المقتطف وعرض حركة بيانات الشبكة في WireShark (باستخدام "http || ssl" كفلتر). ستظهر لك حِزم SSL وTLS المتضمّنة في المعاملة، ولكن يتم تشفير حِزم طلب واستجابة ClientLogin في حِزم "بيانات التطبيق". لا تقلق، سنتعرّف في ما يلي على أداة يمكنها الكشف عن هذه المعلومات المشفّرة.

Fiddler

Fiddler هي أداة رسومية أخرى لتتبُّع الحِزم، ولكنّها تعمل بشكل مختلف تمامًا عن الأدوات المعروضة حتى الآن. يعمل Fiddler كخادم وكيل بين تطبيقك والخدمات البعيدة التي تتفاعل معها، ما يجعله وسيطًا بينك وبين تلك الخدمات. يُنشئ Fiddler اتصالاً عبر بروتوكول SSL مع كل من تطبيقك وخدمة الويب البعيدة، ويزيل تشفير البيانات من إحدى نقاط النهاية، ويسجّل النص العادي، ثم يعيد تشفير البيانات قبل إرسالها. لسوء الحظ، لا يتوفّر Fiddler إلا لنظام التشغيل Windows، ونعتذر عن ذلك لمستخدمي Mac وLinux.

ملاحظة: يتطلّب استخدام طبقة المقابس الآمنة الإصدار 2 من Fiddler والإصدار 2 .0 من.NET Framework.

يتم عرض عدد الزيارات على الشبكة في Fiddler في الغالب من خلال علامة التبويب Session Inspector. إنّ علامات التبويب الفرعية الأكثر فائدة لتصحيح الأخطاء في Google Data APIs هي:

  • العناوين: تعرض عناوين HTTP بتنسيق شجري قابل للتصغير.
  • المصادقة: تعرض عناوين المصادقة.
  • Raw: تعرض محتوى حِزم الشبكة بنص 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
يمكن لبرنامج Fiddler فك تشفير عدد زيارات طبقة المقابس الآمنة (SSL) وعرضها.

يحدث هذا الخطأ عندما يتعذّر التحقّق من الشهادة التي تم إرجاعها من الخادم في اتصال SSL. في هذه الحالة، تأتي الشهادة غير الصالحة من Fiddler، الذي يعمل كوسيط. ينشئ Fiddler الشهادات أثناء التنفيذ، وبما أنّ Fiddler ليس جهة إصدار موثوقة، ستتسبّب هذه الشهادات في تعذُّر إعداد اتصال SSL في Java.

ملاحظة: عند تشغيل Fiddler، سيؤدي أي اتصال SSL تجريه في Internet Explorer إلى ظهور "تنبيه أمني" يسألك عمّا إذا كنت تريد المتابعة على الرغم من الشهادة المشبوهة. يمكنك النقر على "عرض الشهادة" (View Certificate) للاطّلاع على الشهادة التي أنشأها Fiddler.

إذًا، كيف يمكنك تجاوز استثناء الأمان هذا؟ عليك بشكل أساسي إعادة ضبط إعدادات إطار عمل الأمان في Java للسماح بجميع الشهادات. لحسن الحظ، لا تحتاج إلى إعادة اختراع العجلة هنا، يمكنك الاطّلاع على حلّ فرانسيس لابري وإضافة طريقة 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" أو انتقِل إلى موقع WireShark الإلكتروني.

يوفّر Fiddler أيضًا الكثير من الميزات الرائعة، ولكن ما يميّزه هو قدرته على فك تشفير بيانات طبقة المقابس الآمنة. لمزيد من المعلومات، يُرجى الانتقال إلى موقع Fiddler2 الإلكتروني.

تُعدّ تطبيقات تتبُّع الحزم أدوات رائعة يمكنك الاستفادة منها، وقد لاحظ القراء المتابعون أنّها جميعًا مجانية. في المرة القادمة التي تعمل فيها مع واجهات برمجة التطبيقات من Google وتلاحظ شيئًا مريبًا، استخدِم أحد أدوات تحليل الشبكة هذه وألقِ نظرة فاحصة على ما يتم إرساله. إذا لم تتمكّن من العثور على المشكلة، يمكنك دائمًا نشر سؤال في مجموعة المناقشة. سيساعد تضمين رسائل الشبكة ذات الصلة الآخرين في فهم مشكلتك المحددة وتشخيصها.

حظًا سعيدًا واستمتع بالبحث!

الموارد