filter() עבור מהנדסי אבטחה: צינורות דטרמיניסטיים, פחות תוצאות חיוביות כוזבות, ואפס מיתוסים על "מסנן כמחטא"
אם חיפשת "מסנן javascript", סביר להניח שאתה רוצה אחת מהתוצאות הבאות:
- הפוך פלט סריקה רועש לפלט נקי, ניתן לפעולה רשימה מצומצמת.
- סנן מערכי אובייקטים (נכסים, ממצאים, IOCs, כללים) מבלי לכתוב לולאות ספגטי.
- הפוך את הסינון למהיר מספיק כדי לפעול בתוך CI, סביבת בדיקה של דפדפן או צינור אבטחה.
- הימנע מהמלכודת הקלאסית: "סינון מחרוזות" ≠ "הפיכת קלט לא אמין לבטוח".
זהו המקום שבו הרבה כלי אבטחה נכשלים בשקט.
יש סיבה לשאילתת הזנב הארוך "מערך אובייקטים של מסנן javascript" הוא נצחי: שרשור קנוני ב-Stack Overflow שכותרתו בדיוק כך נמצא בכתובת "נצפה 228,000 פעמים", המהווה אינדיקציה ברורה למה שהעוסקים בתחום באמת לוחצים, מעתיקים ומיישמים. (עומס יתר)
מה Array.prototype.filter() ערבויות (ומה בהחלט לא)
ברמת השפה, filter():
- מחזיר מערך חדש המכיל אלמנטים שהנשוא שלהם מחזיר ערך אמת.
- מייצר העתקה רדודה (הפניות לאובייקטים משותפות, לא משוכפלות). (מסמכי MDN Web)
- דילוגים חריצים ריקים במערך דליל (הנשוא שלך אינו נקרא עבור "חורים"). (TC39)
MDN מפורש הן לגבי "העתקה שטחית" והן לגבי "אי-הפעלה עבור משבצות ריקות במערך דליל". (מסמכי MDN Web)
מפרט ECMAScript מציין במפורש כי לא מתבצעת קריאה לפונקציות callback עבור אלמנטים חסרים. (TC39)
מדוע מערכים דלילים חשובים בצינורות אבטחה
מערך דליל מופיע יותר ממה שהיית מצפה: המרות JSON, באגים של "מחיקת אינדקס", תוצאות חלקיות ממיזוג מקורות מרובים או דה-דופליקציה נאיבית.
const results = [ {id: 1}, , {id: 3} ]; // שימו לב לחור const kept = results.filter(() => true); console.log(kept); // [{id: 1}, {id: 3}] (החור נעלם)
אם הצינור שלך מניח "אורך זהה בכניסה, אורך זהה ביציאה", מערכים דלילים ישבשו אותו. בצינור מיון, זה יכול להתורגם ל שקט אובדן נתונים.
הדפוס בעל שיעור הקליקים הגבוה: סינון מערכים של אובייקטים
רוב השימושים האמיתיים ב"מסנן ג'אווה סקריפט" הם סינון מערכים של אובייקטים (נכסים/ממצאים/IOCs).
דוגמה: שמור רק ממצאים ברשת שניתן לנצל, עם ראיות מצורפות.
ממצאים קבועים = [ { id: "XSS-001", type: "xss", severity: "high", verified: true, evidence: ["req.txt", "resp.html"] },
{ id: "INFO-009", type: "banner", severity: "info", verified: false, evidence: [] }, { id: "SSRF-004", type: "ssrf", severity: "critical", verified: true, evidence: ["dnslog.png"] }, ];
const actionable = findings.filter(f => f.verified && (f.severity === "high" || f.severity === "critical") && f.evidence?.length > 0 );
console.log(actionable.map(f => f.id)); // ["XSS-001", "SSRF-004"]
דוגמה: בקרת היקף (המקום הקל ביותר להרוס את התוכנית שלך)
const inScopeHosts = new Set(["api.example.com", "admin.example.com"]); const assets = [ { host: "api.example.com", ip: "203.0.113.10", alive: true },
{ host: "cdn.example.com", ip: "203.0.113.11", alive: true }, { host: "admin.example.com", ip: "203.0.113.12", alive: false }, ];
const targets = assets .filter(a => a.alive) .filter(a => inScopeHosts.has(a.host)); console.log(targets); // [{host:"api.example.com", ...}]
שימוש ב- הגדר נמנע מתאונות O(n²) תבנית (כולל() בתוך filter() על פני מערכים גדולים). זה חשוב כאשר מסננים עשרות אלפי נכסים.
מציאות הביצועים: מערכים צפופים לעומת מערכים מחוררים, ומדוע כדאי לכם להתייחס לכך רק במעט
V8 מבחין באופן ידוע בין עמוס ו חורי מערך; פעולות על מערכים דחוסים הן בדרך כלל יעילות יותר מאשר על מערכים עם חורים. (V8)
השלכות ביטחוניות: צינורות שיוצרים חורים (מחק arr[i], מיזוגים דלילים) עלולים לפגוע בביצועים ו נכונות. הכלל המעשי הוא פשוט:
- אל תיצרו חורים. העדיפו
לחבר,מסנן, או לבנות מחדש מערכים. - הימנע מערבוב סוגים במערך חם אם אתה מעבד מערכי נתונים גדולים.
טבלת החלטות של מהנדס אבטחה: מסנן vs כמה vs למצוא vs להפחית
| יעד בצינור אבטחה | הכלי הטוב ביותר | למה | טעות נפוצה |
|---|---|---|---|
| שמור את כל ההתאמות (רשימה קצרה) | filter() | מחזיר מערך תת-קבוצה | מקור מוטציה במהלך הנשוא |
| עצור בהתאמה הראשונה (שער מדיניות) | כמה() | בוליאני יציאה מוקדמת | filter().length > 0 |
| קבל התאמה ראשונה (בחירת מסלול) | find() | יציאה מוקדמת + אלמנט | filter()[0] |
| בנה מדדים (ספירות, ציונים) | צמצם() | צירוף במעבר אחד | ביצוע I/O יקר במפחית |
זה פחות קשור לסגנון ויותר ליצירת צינור עבודה דטרמיניסטי וזול מספיק כדי לפעול בכל מקום (CI, סביבת בדיקה בדפדפן, סוכני ריצה).
העומס המסוכן: "סינון" אינו "טיהור"
ועכשיו החלק שבו מהנדסי אבטחה צריכים להיות חסרי רחמים: סינון מחרוזות אינו מהווה גבול אבטחה.
ההנחיות למניעת XSS של OWASP מדגישות קידוד פלט (והשימוש בהגנה הנכונה בהקשר הנכון) במקום להסתמך על סינון קלט. (סדרת דפי העזר של OWASP)
תוכן "עקיפת מסנן XSS" של OWASP מגדיר במפורש סינון קלט כהגנה לא מלאה ומפרט דרכי עקיפה. (סדרת דפי העזר של OWASP)
דף העזר של PortSwigger בנושא XSS (עודכן באוקטובר 2025) מפורש באותה מידה, שכן הוא כולל וקטורים המסייעים לעקוף WAFs ומסננים. (PortSwigger)
דוגמה מציאותית: "מסננים" של כתובות URL שמתמוטטים עקב הבדלים בניתוח תחבירי.
דפוס רע:
פונקציה allowUrl(u) { החזר !u.includes("javascript:") && !u.includes("data:"); }
תבנית טובה יותר: ניתוח + רשימת התאמות + נורמליזציה:
function allowUrl(u, allowedHosts) { const url = new URL(u, ""); // בסיס בטוח עבור קלט יחסי if (!["https:"].includes(url.protocol)) return false; return allowedHosts.has(url.hostname); }
const allowedHosts = new Set(["docs.example.com", "cdn.example.com"]);
זהו השינוי המנטלי: הפסקת התאמת מחרוזות, התחל לאמת נתונים מובנים.
CVE המוכיחים כי "מסננים/מטהרים" נכשלים בייצור ומדוע כדאי לשלב אותם בבדיקות שלכם
כאשר הארגון שלך אומר "אנו מחטאים HTML", מודל האיומים שלך צריך לכלול באופן מיידי: איזה חומר חיטוי, איזו גרסה, איזו תצורה ואיזה היסטוריית עקיפה?
CVE-2025-66412 (מהדר תבניות Angular מאוחסן XSS)
NVD מתאר XSS מאוחסן במהדר התבניות של Angular עקב סכימת אבטחה פנימית לא שלמה, המאפשרת לעקוף את מנגנון הניקוי המובנה של Angular; תוקן בגרסאות מתוקנות. (NVD)
מסקנה בנושא אבטחה: "טיהור מסגרת" אינו ערובה קבועה. התייחסו אליו כמו לכל אמצעי בקרה אחר: גרסה, ייעוץ, בדיקות רגרסיה.

CVE-2025-26791 (DOMPurify mXSS באמצעות ביטוי רגולרי שגוי)
NVD מציין כי DOMPurify לפני גרסה 3.2.4 הכיל ביטוי רגולרי שגוי של תבנית ליטרלית, אשר עלול להוביל למוטציה XSS במקרים מסוימים. (NVD)
מסקנה בנושא אבטחה: אפשרויות החיטוי חשובות. שילובי תצורה יכולים ליצור תנאים לניצול לרעה גם כאשר אתה "משתמש בספרייה מכובדת".
CVE-2024-45801 (עקיפת בדיקת עומק DOMPurify + החלשת זיהום אב טיפוס)
NVD מדווח כי טכניקות קינון מיוחדות עשויות לעקוף את בדיקת העומק; זיהום אב טיפוס עלול להחליש אותה; תוקן בגרסאות מאוחרות יותר. (NVD)
מסקנה בנושא אבטחה: הגנות המסתמכות על היוריסטיקה (מגבלות עומק, בדיקות קינון) הופכות לעתים קרובות למטרות עקיפה.
CVE-2025-59364 (express-xss-sanitizer רקורסיה DoS)
NVD מציין עומק רקורסיה בלתי מוגבל במהלך טיהור גופי בקשות JSON מקוננים; הודעת GitHub מפרטת את ההשפעה ואת הגרסאות המתוקנות. (NVD)
מסקנה בנושא אבטחה: קוד "חיטוי" עלול לגרום לבאגים בזמינות. תוקפים אינם זקוקים ל-XSS אם הם יכולים לקרוס את השירות שלך באופן אמין.
דפוסים מעשיים של "מסנן ג'אווה סקריפט" לאוטומציה של בדיקות חדירה
1) סינון לפי רמת ביטחון: שמור רק מועמדים בעלי רמת ביטחון גבוהה לאימות יקר.
const candidates = [ { id: "C1", signal: 0.92, cost: 3.0 }, { id: "C2", signal: 0.55, cost: 1.2 }, { id: "C3", signal: 0.81, cost: 9.5 }, ];
const budget = 10; const shortlist = candidates .filter(c => c.signal >= 0.8) // סף ביטחון .filter(c => c.cost c.id)); // ["C1"]
2) שלמות הראיות: אל תתנו לדוחות לצאת לדרך ללא הוכחות
const reportItems = findings.filter(f => f.verified && Array.isArray(f.evidence) && f.evidence.length >= 1 );
3) מסנני Kill-switch: אכיפת מדיניות לפני כל שלב של ניצול
שימוש כמה() עבור "דחה אם יש התאמות":
const forbidden = [/\\.gov$/i, /\\.mil$/i]; const isForbidden = host => forbidden.some(rx => rx.test(host));
היכן Penligent מתאים
בתהליך עבודה המבוסס על "ראיות תחילה", filter() נהדר עבור תזמור דטרמיניסטי: להחליט מה לאמת בהמשך, אילו נתיבים לחקור ומה יופיע בדו"ח הסופי. החלק הקשה הוא מעגל האימות: לשחזר, לאסוף ראיות ולשמור על עקביות בתוצאות בין הריצות.
זהו סוג המקום שבו פלטפורמת בדיקות חדירות מבוססת AI יכולה להשתלב באופן טבעי: מסננים את המועמדים בקוד, ואז משתמשים במערכת אוטומטית כדי לאמת, לאסוף ראיות ולשמור על עקביות בביצוע בכל הסביבות. מיצובה של Penligent כפלטפורמת בדיקות חדירות מבוססת AI הגיוני במיוחד בקטע "אימות + ראיות + דוח" של התהליך.
Penligent: https://penligent.ai/

רשימת בדיקה קצרה לשמירה על אבטחת השימוש ב"מסנן ג'אווה סקריפט"
- טיפול
filter()כמו עיצוב נתונים, ולא "טיהור קלט". - הימנע ממערך דליל; זכור כי פונקציות callback מדלגות על משבצות ריקות. (TC39)
- שימוש
הגדר/מפהלמסנני חברות בקנה מידה גדול. - העדפה
כמה()/find()כאשר אתה צריך לצאת מוקדם. - להגנה מפני XSS, יש לפעול על פי הנחיות הקידוד מבוססות הקשר של OWASP, ולא על פי מסנני רשימה שחורה. (סדרת דפי העזר של OWASP)
- עקבו אחר CVE של חומרי חיטוי/מסגרות כסיכון מדרגה ראשונה בשרשרת האספקה. (NVD)
הפניות וקישורים סמכותיים (העתק/הדבק)
- MDN
Array.prototype.filter(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter (מסמכי MDN Web) - הערה במפרט ECMAScript על דילוג על אלמנטים חסרים: https://tc39.es/ecma262/multipage/indexed-collections.html (TC39)
- V8 "סוגי אלמנטים" (ארוזים לעומת מחוררים): https://v8.dev/blog/elements-kinds (V8)
- Stack Overflow "javascript filter array of objects" (נצפה 228,000 פעמים): https://stackoverflow.com/questions/13594788/javascript-filter-array-of-objects (עומס יתר)
- דף עזר למניעת XSS של OWASP: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html (סדרת דפי העזר של OWASP)
- דף עזר לעקיפת מסנן XSS של OWASP: https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html (סדרת דפי העזר של OWASP)
- דף עזר ל-PortSwigger XSS (2025): https://portswigger.net/web-security/cross-site-scripting/cheat-sheet (PortSwigger)
- NVD CVE-2025-66412 (XSS מאוחסן ב-Angular): https://nvd.nist.gov/vuln/detail/CVE-2025-66412 (NVD)
- הודעה על פגיעות ב-Angular (CVE-2025-66412): https://github.com/angular/angular/security/advisories/GHSA-v4hv-rgfq-gp49 (GitHub)
- NVD CVE-2025-26791 (DOMPurify mXSS): https://nvd.nist.gov/vuln/detail/CVE-2025-26791 (NVD)
- NVD CVE-2024-45801 (עקיפת בדיקת עומק DOMPurify): https://nvd.nist.gov/vuln/detail/CVE-2024-45801 (NVD)
- NVD CVE-2025-59364 (express-xss-sanitizer DoS): https://nvd.nist.gov/vuln/detail/CVE-2025-59364 (NVD)
- הודעת GitHub GHSA-hvq2-wf92-j4f3: https://github.com/advisories/GHSA-hvq2-wf92-j4f3 (GitHub)

