בדרך כלל אני נוטה לחשוב שבנקים ואתרים שהתעסקות עם כסף של אחרים היא הביזנס המרכזי שלהם לוקחים את האבטחה ברצינות.
על ההנחה הזו אני מבסס הרבה דברים, כמו למשל ההנחה שלי שקניה באינטרנט היא יותר בטוחה מקניה בטלפון, וזה שאיפשרתי העברת כספים מחשבון הבנק שלי בהוראה דרך האינטרנט.
באופן טבעי תפסתי גם את Paypal כאתר שלוקח אבטחה ברצינות.
החלטתי לצ’פר משתמשי פיירסטטס שתורמים ולתת כמה פיצ’רים למי שתורם בלבד.
מכיוון שאני מקבל את התרומות דרך Paypal חשבתי שזה יהיה נחמד לדאוג לאיזה תהליך אוטומטי שישלח לתורמים אימייל עם לינק להורדה של הפיצ’רים הנוספים.
פניתי לאתר של Paypal, שתומך במשהו שנקרא IPN : Instant payment notification.
בקצרה, האתר של Paypal קורא לURL שאתם מספקים לו ומעביר לו פרטים על הטרנזקציה (מי זה, כמה הוא נתן, וכו’).
האתר שלכם מאמת את הפרטים מול Paypal, ומכניס אותם לבסיס הנתונים ועושה מה שאתם רוצים.
די פשוט, אבל חבל בזבוז אנרגיה שכל מי שרוצה להתממשק מול Paypal יצטרך לכתוב את זה מחדש, ולכן Paypal בחוכמתם מספקים Script generator שמייצר קוד שעושה את העבודה במספר שפות.
שמח וטוב לבב, לקחתי את סקריפט הPHP שהוא ייצר לי, והתחלתי לשחק איתו.
לא עבר יותר מדי זמן, ופתאום הבנתי שחוץ מזה שהקוד מכוער במיוחד הוא גם פרוץ לחלוטין ופגיע להתקפת SQL Injection.
values (’”.$txn_id.“‘,’”.$_POST[$itemnumber].“‘,’”.$_POST[$itemname].“‘,’”.$_POST[$on0]. “‘,’”.$_POST[$os0].“‘,’”.$_POST[$on1].“‘,’”.$_POST[$os1].“‘,’”.$_POST[$quantity].“‘,’”.$invoice.“‘,’”.$custom.“‘)”;
$result = mysql_query($struery) or paypal_die(“Cart - paypal_cart_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());
SQL Injection היא התקפה שמאפשרת שינוי וקריאה של בסיס הנתונים בצורה שהמפתח לא תכנן, עוד פרטים בוויקיפדיה.
מה שזה אומר זה שכל מי שהשתמש בקוד לדוגמא שלהם בלי לשים לב לבעיה (אני מניח ש99% מהמשתמשים) יצר לעצמו בעיית אבטחה בשרת, בדיוק בנקודה הקריטית שנוגעת לכסף.
כתבתי להם הודעה בפורום המפתחים שלהם, נקווה שהם יקחו אותה ברצינות.
רסיסים (RSS)
July 12th, 2008 ב17:31
שלום,
ראיתי את הקוד שהם מציגים ויש שם את החלק הזה:
// subscription specific vars
$subscr_id = $_POST['subscr_id'];
$subscr_date = $_POST['subscr_date'];
$subscr_effective = $_POST['subscr_effective'];
$period1 = $_POST['period1'];
$period2 = $_POST['period2'];
$period3 = $_POST['period3'];
$amount1 = $_POST['amount1'];
$amount2 = $_POST['amount2'];
$amount3 = $_POST['amount3'];
$mc_amount1 = $_POST['mc_amount1'];
$mc_amount2 = $_POST['mc_amount2'];
$mc_amount3 = $_POST['mcamount3'];
$recurring = $_POST['recurring'];
$reattempt = $_POST['reattempt'];
$retry_at = $_POST['retry_at'];
$recur_times = $_POST['recur_times'];
$username = $_POST['username'];
$password = $_POST['password'];
בסוף יש 2 משתנים: username ו password.
אתה יודע מה הם מכילים?!
את השם משתמש והסיסמא של הלקוח? או של הבעל עסק?
בשני המקרים זה בעיה..
July 12th, 2008 ב18:06
זה משהו שהם משתמשים בו רק במקרה של subscription.
לא ברור לי מה זה בדיוק, אבל לא נראה לי שזה בעייתי במיוחד.
July 12th, 2008 ב20:24
אז אם למשל יש לי subscription באתר כולשהו, אז יש להם במסד את הסיסמא של הפאיפל שלי?!
July 12th, 2008 ב20:27
לא בדיוק.
תקרא כאן:
https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html
חפש password.
August 2nd, 2008 ב18:14
נו?! מה נגמר? יש תיקון? על מי השפיע החור?
אל תשמור אותנו במתח! החשבונית הגיע?
נו! הגיעה הזמן לעדכון!
August 3rd, 2008 ב13:18
http://www.pdncommunity.com/pdn/board/message?board.id=ipn&thread.id=12275
“I still think the example is a bad example that should be fixed, but I agree that it’s not as critical as I initially thought.” מפי המקור.
August 9th, 2008 ב9:55
עירא,
החור לא משפיע על אף אחד (חוץ אולי מעל השרתים של paypal עצמם) כי הקוד כתוב בצורה כזו שקודם המידע מאומת מול פייפל ורק אז אתה אמור לכתוב אותו לבסיס הנתונים שלך.
הקוד עדיין חובבני ונותן דוגמא רעה ביותר, אבל החור פחות קריטי ממה שהיה נדמה במבט ראשון.
ולא: הוא לא תוקן.