100%
כל המאמרים ←

JavaScript חופשי: חופש משתמשים, פרטיות ואבטחה

קוד קריא, רישיונות ברורים, GNU LibreJS והגנות מעשיות בדפדפן.

English
איור דפדפן מפורט עם קוד חופשי, מסמך רישיון, מגן ובקרות פרטיות.
איור וקטורי מקורי; שמות הפרויקטים מציינים את נושא המאמר ואינם מעידים על חסות.

חופש הוא זכות, ולא תג מחיר

JavaScript חופשי הוא קוד שרישיונו מאפשר למשתמשים להריץ, ללמוד, לשנות ולשתף אותו. הורדה ללא תשלום אינה מספיקה כדי להעניק את הזכויות האלה. גם קובץ שאפשר לקרוא אינו בהכרח מופץ ברישיון מתאים. המטרה היא שלמשתמש בדפדפן תהיה שליטה ממשית בתוכנות שהאתר מבקש ממנו להפעיל.

JavaScript היא תוכנה במחשב של המבקר

אתר ששולח JavaScript מבקש מהדפדפן להריץ תכנית. קמפיין JavaScript החופשי של ה־FSF טוען שלמשתמשים צריכות להיות זכויות ללמוד, לשנות ולשתף את התכניות האלה. המאמר של ריצ׳רד סטולמן, The JavaScript Trap, מציג את הבעיה מזווית החופש. זו עמדה על זכויות המשתמש, ולא טענה שכל תסריט הוא זדוני.

אפשר לראות קוד בכלי הפיתוח ועדיין לא לקבל רישיון חופשי להשתמש בו. גם קוד שעבר מזעור יכול להיות קשה ללימוד, אף שהפרויקט המקורי משתמש ברישיון מתאים. הפצה אחראית צריכה לכלול את הצורה המועדפת לשינוי, מידע רישוי והסבר כיצד נוצרו הקבצים שנשלחים למבקר.

לפרסם את החופש באופן ברור

הנחיות GNU מסבירות דרכים לסמן רישיונות של JavaScript ולהוסיף הצהרות שניתן לקרוא גם באמצעות כלים. GNU LibreJS מנסה לזהות ולחסום תסריטים לא־חופשיים שאינם זניחים, תוך התרת קוד חופשי או זניח. זה כלי למדיניות חופש מסוימת; אין לראות בו אנטי־וירוס או הוכחה שהאתר מאובטח.

באתר קהילתי קטן עדיף בעינינו שהקריאה והניווט הבסיסי יעבדו בלי תסריטים. אפשר להוסיף יכולת שימושית בהדרגה, לשמור קוד נחוץ במיקום מבוקר ולפרסם מקור ורישיון. ספרייה חיצונית אינה נדרשת לכל אפקט עיצובי.

חופש ואבטחה עונים על שאלות שונות

רישיון חופשי מעניק זכויות, אך אינו מאשר שקוד נכתב ללא חולשות. גם תסריט חופשי יכול להכיל XSS: מצב שבו תוכן לא מהימן הופך לתוכן בר־הרצה בדף. צריך לטפל בפלט בהתאם להקשר ולהעדיף ממשקים שמציגים טקסט כשאין צורך לפרש HTML.

מן הצד השני, בדיקת אבטחה מוצלחת אינה מעניקה למשתמש זכות לשנות את התכנית. בבדיקה שאנו מציעים, רישוי ואבטחה הם שני נושאים עצמאיים. אף אחד מהם אינו מחליף את האחר.

לצמצם את הנזק האפשרי

Content Security Policy יכולה להגביל הרצת תסריטים וטעינת משאבים. זה מנגנון הגנה נוסף, ולא תחליף לתיקון פלט מסוכן. מדיניות מחמירה יותר יכולה להשתמש ב־nonce או בגיבוב, אך צריך לבדוק אותה כדי שלא תשבור יכולות תקינות.

כדאי לצמצם תסריטים מצד שלישי, לתעד אילו נתונים הם מקבלים ולעדכן תלויות באופן מסודר. סודות אינם שייכים לקוד שנשלח לדפדפן. הסתרת כפתור גם אינה בקרת הרשאות: ההחלטה אם מותר לבצע פעולה חייבת להתקבל בשרת.

רשת חופשית צריכה להישאר שימושית

המטרה הקהילתית שלנו היא אתר שאפשר לקרוא, להבין ולתחזק. HTML ברור, מעט תסריטים ורישוי גלוי מסייעים לכך. קישורים רגילים ובקרים עם תוויות הם חלק מהגישה הזאת. להמשך קראו על PHP ו־SQL בצד השרת ועל חירויות התוכנה של GNU.

להציג קלט כטקסט כשזה מה שנדרש

בתצוגה מקדימה של טקסט פשוט השתמשו ב־textContent במקום לפרש את טקסט המבקר כ־HTML. הדוגמה מדגימה החלטת פלט אחת בלבד, ואינה מודל אבטחה שלם ליישום.

const preview = document.querySelector('[data-preview]');
const input = document.querySelector('[data-message]');
if (preview && input) {
  preview.textContent = input.value;
}

Java היא נושא נפרד

למאמר הנפרד על Java ו־OpenJDK.