הפאנל db_manager הוא ממשק מלא למסד הנתונים בתוך האדמין: אפשר לדפדף בטבלאות, לערוך שורות, להריץ שאילתות, לייצא ולשנות מבנה. הוא כלי עוצמתי למפתחים, והדף מסביר מה בדיוק הוא עושה, מי יכול להשתמש בו, ומה הסיכונים.
בעמוד הזה system/ הוא תיקיית הליבה הפרוסה (= api/core בריפו) ו-{admin} הוא CONFIG::$admin_url של האתר.
execute_query מזהה רק שאילתות קריאה (SELECT, SHOW, DESCRIBE, DESC, EXPLAIN) ומוסיף להן עימוד. כל משפט אחר (DROP, TRUNCATE, UPDATE, DELETE) מורץ כפי שהוא, דרך DB::sql. מי שמגיע לפאנל יכול למחוק או להרוס כל טבלה. הגבילו אותו למפתחים בלבד, וגבו לפני שימוש. המסמך DB_MANAGER_README.md בשורש הריפו מתאר אותו כבונה שאילתות לקריאה בלבד, והקוד אינו כך.גישה והרשאות#
הפאנל הוא קובץ api/core/admin/db_manager.php (מחלקה ADMINMODULE_db_manager). הוא מופיע בתפריט רק אם קיימת לו שורה ב-CRM_adminPanel_panels, והרשאה אליו נקבעת כמו לכל פאנל (הרשאות אדמין). אם בשורה perm_developer = 1, רק מפתח Wizzo (ADMIN::is_developer()) יראה אותו. רישום שורה ידנית: ראו SQL להקמה.
הקובץ install_db_manager.php אמור לרשום את הפאנל, אבל הוא קורא ל-DB::insert, שלא קיימת, ולכן הוא קוד מת.
מה אפשר לעשות#
הפאנל מספק endpoint אחד, {admin}/db_manager/api?action=... (GET, או POST עם גוף JSON). הפעולות:
| קבוצה | פעולות |
|---|---|
| עיון | tables, table_info, table_details, table_data, row, collations, change_collation |
| שורות | insert_row, update_row, update_cell, duplicate_row, delete_row, bulk_delete, bulk_insert |
| שאילתות | execute_query, export_query_results |
| ייצוא | export_excel (CSV), export_json, export_sql |
| מבנה | create_table, add_column, modify_column, drop_column, drop_table, truncate_table, rename_table, duplicate_table, add_index, drop_index |
| AI | ai_generate_query, ai_analyze_table, ai_explain_query, ai_fix_query, ai_generate_seed |
העמוד הראשי (index) מציג לוח מחוונים: מספר טבלאות, גודל ב-MB, סך שורות וגרסת MySQL.
פעולות AI#
פעולות ה-ai_* שולחות לשירות ה-LLM (wizzo_ai) את סכמת הטבלה, ובחלקן גם דגימה קטנה של נתונים, כדי לייצר או להסביר שאילתה או נתוני בדיקה. ודאו שאין בטבלה מידע שאסור להעביר לשירות חיצוני לפני שמשתמשים בהן.
איך הפאנל מתגונן#
| מנגנון | פירוט |
|---|---|
| שמות טבלה ועמודה | עוברים ident(), שמתיר רק [A-Za-z0-9_] |
| חיפוש בטבלה | DB::escape(addcslashes($search, "%_")) |
| מיון | נבדק מול העמודות האמיתיות של הטבלה |
| גודל עמוד | מוגבל ל-500 שורות |
| שגיאות | HTTP 400 עם JSON {"success": false, "error": "..."} |
ההגנות האלה מונעות הזרקה דרך שמות טבלאות, חיפוש ומיון. הן לא מגבילות את מה שהמשתמש עצמו כותב בעורך ה-SQL.
ADMIN::verify_csrf_token() נקראת בליבה רק בטופס הכניסה ובמנהל הקבצים. ב-db_manager.php היא לא נקראת, ולכן פעולות הכתיבה של הפאנל נשענות על ההרשאות ועל ה-cookie של האדמין בלבד, למרות ש-DB_MANAGER_README.md מזכיר הגנת CSRF. אל תניחו הגנה שאינה קיימת. ראו CSRF, XSS ו-SQLi.הפאנל safe_sql: חלופה מצומצמת#
{admin}/safe_sql מיועד לשינויי מבנה בלבד, וכך הוא מצמצם נזק:
- מתיר רק
CREATE TABLE,CREATE INDEX,CREATE UNIQUE INDEXו-ALTER TABLE ... ADD. - חוסם לפי ביטוי רגולרי:
DROP,DELETE,TRUNCATE,UPDATE,RENAME,MODIFY,CHANGE,REMOVE, וגם כמה משפטים באותה הרצה (;ואחריו טקסט). - מעביר את המשפט לבדיקת AI (
type: sql_validation). - רושם כל ניסיון ב-
CRM_safe_sql_log. הפעולות בפאנל:index,execute,create_log_table,clear_history.
אם שירות ה-AI מחזיר שגיאה, המשפט מותר. ההגנה העיקרית היא הבדיקה הרגולרית, לא ה-AI.
מתי להשתמש במה#
| צורך | כלי |
|---|---|
| להסתכל על נתונים | db_manager (קריאה) |
| להוסיף טבלה, עמודה או אינדקס | safe_sql, או db_manager |
| תיקון שורה בודדת | db_manager אחרי גיבוי |
| פעולה מתוכנתת מהקוד | שכבת ה-DB, לא הפאנל |
| לראות מה רץ | דיבוג SQL |