[{"data":1,"prerenderedAt":720},["ShallowReactive",2],{"navigation_docs":3,"-modules-problems-security":238,"-modules-problems-security-surround":717},[4,45,60],{"title":5,"description":6,"icon":7,"path":8,"stem":9,"children":10},"Методология",null,"ruler","\u002Fmethodology","1.methodology",[11,15,20,25,30,35,40],{"title":12,"path":8,"stem":13,"description":14},"bxshef: методология и проверка навыков","1.methodology\u002Findex","Как писать навыки ИИ-агентов для Битрикса и как проверять, что им можно верить",{"title":16,"path":17,"stem":18,"description":19},"Стандарт навыка","\u002Fmethodology\u002Fstandard","1.methodology\u002F1.standard","11 правил, каждое из провала на стенде",{"title":21,"path":22,"stem":23,"description":24},"Методология проверки","\u002Fmethodology\u002Fmethod","1.methodology\u002F2.method","lint → eval → стенд; что измерено",{"title":26,"path":27,"stem":28,"description":29},"bxshef — CLI","\u002Fmethodology\u002Fbxshef","1.methodology\u002F3.bxshef","lint, eval, feedback",{"title":31,"path":32,"stem":33,"description":34},"GitHub Action","\u002Fmethodology\u002Faction","1.methodology\u002F4.action","тот же lint + eval в любом репозитории навыков",{"title":36,"path":37,"stem":38,"description":39},"Заготовка репозитория","\u002Fmethodology\u002Ftemplate","1.methodology\u002F5.template","с чего начать автору модуля",{"title":41,"path":42,"stem":43,"description":44},"Приёмник отзывов","\u002Fmethodology\u002Ffeedback","1.methodology\u002F6.feedback","куда уходят отзывы ИИ-агентов",{"title":46,"description":6,"icon":47,"path":48,"stem":49,"children":50},"Навыки","sparkles","\u002Fskills","2.skills",[51,55],{"title":52,"path":48,"stem":53,"description":54},"Навыки shef.*","2.skills\u002Findex","npx skills add bx-shef\u002Fskills",{"title":56,"path":57,"stem":58,"description":59},"shef-feedback","\u002Fskills\u002Fshef-feedback","2.skills\u002F1.shef-feedback","Отправить отзыв о навыке shef-* или навыке команды. Брать ВСЕГДА, когда просят оставить или отправить отзыв о навыке — даже если сам навык в диалоге не виден, —",{"title":61,"description":6,"icon":62,"path":63,"stem":64,"children":65},"Модули shef.*","package","\u002Fmodules","3.modules",[66,69,131,179],{"title":61,"path":63,"stem":67,"description":68},"3.modules\u002Findex","Что за чем ставить",{"title":70,"description":6,"path":71,"stem":72,"children":73},"shef.options","\u002Fmodules\u002Foptions","3.modules\u002F1.options\u002Findex",[74,76,81,86,91,96,101,106,110,114,119,123,127],{"title":70,"path":71,"stem":72,"description":75},"фундамент: настройки, трейты, компоненты",{"title":77,"path":78,"stem":79,"description":80},"[`\\Shef\\Options\\Installator`] Installer","\u002Fmodules\u002Foptions\u002Finstaller","3.modules\u002F1.options\u002F1.installer","Для облегчения установок.",{"title":82,"path":83,"stem":84,"description":85},"Сборка, CI и релиз","\u002Fmodules\u002Foptions\u002Fbuild-and-install","3.modules\u002F1.options\u002F10.build-and-install","Раскладка репозитория — в module-structure.md, процесс —\nв CONTRIBUTING.md, установка глазами пользователя —\nв README.md.",{"title":87,"path":88,"stem":89,"description":90},"Раскладка репозитория","\u002Fmodules\u002Foptions\u002Fmodule-structure","3.modules\u002F1.options\u002F11.module-structure","Файл про устройство репозитория. Опорные точки модуля — в CLAUDE.md,\nпроцесс — в CONTRIBUTING.md, сборка — в\nbuild-and-install.md.",{"title":92,"path":93,"stem":94,"description":95},"Проверка на портале","\u002Fmodules\u002Foptions\u002Fportal-check","3.modules\u002F1.options\u002F12.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, кеш,\nраскладка файлов, поведение при обновлении. Проверять это приходится руками —\nи лучше по списку, потому что забытый шаг находит не разработчик, а клиент.",{"title":97,"path":98,"stem":99,"description":100},"[`\\Shef\\Options\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Foptions\u002Foptions","3.modules\u002F1.options\u002F2.options","Поддерживает следующие типы:",{"title":102,"path":103,"stem":104,"description":105},"Работа с пользователями","\u002Fmodules\u002Foptions\u002Fsecurity","3.modules\u002F1.options\u002F3.security","",{"title":107,"path":108,"stem":109,"description":105},"[`\\Shef\\Options\\Main\\Utils`] Утилиты","\u002Fmodules\u002Foptions\u002Futils","3.modules\u002F1.options\u002F4.utils",{"title":111,"path":112,"stem":113,"description":105},"[`\\Shef\\Options\\Components`] Работа с компонентами","\u002Fmodules\u002Foptions\u002Fcomponents","3.modules\u002F1.options\u002F5.components",{"title":115,"path":116,"stem":117,"description":118},"[`\\Shef\\Options\\Options`] Паттерны","\u002Fmodules\u002Foptions\u002Fpattern","3.modules\u002F1.options\u002F6.pattern","Запускаемые примеры: singleton.php,\nconfig.php, smartstd.php —\nкак их гонять, написано в examples\u002FREADME.md.",{"title":120,"path":121,"stem":122,"description":105},"[`\\Shef\\Options\\Tests`] Тестирование","\u002Fmodules\u002Foptions\u002Ftests","3.modules\u002F1.options\u002F7.tests",{"title":124,"path":125,"stem":126,"description":105},"[`\\Shef\\Options\\TraitList`] Набор трейтов","\u002Fmodules\u002Foptions\u002Ftraitlist","3.modules\u002F1.options\u002F8.traitlist",{"title":128,"path":129,"stem":130,"description":105},"Правила для ИИ-агентов в этом репозитории","\u002Fmodules\u002Foptions\u002Fagent-rules","3.modules\u002F1.options\u002F9.agent-rules",{"title":132,"description":6,"path":133,"stem":134,"children":135},"shef.problems","\u002Fmodules\u002Fproblems","3.modules\u002F2.problems\u002Findex",[136,138,143,147,152,157,161,166,169,172,175],{"title":132,"path":133,"stem":134,"description":137},"логи, журнал событий, учёт проблем",{"title":139,"path":140,"stem":141,"description":142},"[`\\Shef\\Problems\\Integration`] События и меню","\u002Fmodules\u002Fproblems\u002Fevents","3.modules\u002F2.problems\u002F1.events","Что модуль регистрирует в ядре при установке. Список — в .settings.php, ключ\ninstallEvents; что каждый обработчик существует, сверяет\ntests\u002Fsettings_test.php.",{"title":144,"path":145,"stem":146,"description":105},"Безопасность логов","\u002Fmodules\u002Fproblems\u002Fsecurity","3.modules\u002F2.problems\u002F10.security",{"title":148,"path":149,"stem":150,"description":151},"Быстрая отладка: `_pr`, `_log`, `_log1`","\u002Fmodules\u002Fproblems\u002Fdeffunctions","3.modules\u002F2.problems\u002F2.deffunctions","Функции объявляет def-functions.php, подключается он из include.php.",{"title":153,"path":154,"stem":155,"description":156},"Уровни логирования","\u002Fmodules\u002Fproblems\u002Floglevel","3.modules\u002F2.problems\u002F3.loglevel","Уровни — стандарт PSR-3, в Monolog это \\Monolog\\Level. Ниже — когда какой брать.",{"title":158,"path":159,"stem":160,"description":105},"[`\\Shef\\Problems\\Integration\\Monolog`] Monolog","\u002Fmodules\u002Fproblems\u002Fmonolog","3.modules\u002F2.problems\u002F4.monolog",{"title":162,"path":163,"stem":164,"description":165},"Ротация логов","\u002Fmodules\u002Fproblems\u002Flogrotate","3.modules\u002F2.problems\u002F5.logrotate","Логи модуля лежат в каталоге логов — по умолчанию на уровень выше корня сайта,\nдля BitrixVM \u002Fhome\u002Fbitrix\u002Fsh_log\u002F*.log, — и сами не чистятся. Ротацию делает\nlogrotate — системная утилита, а не Monolog: Monolog тоже умеет\n(RotatingFileHandler), но тогда за файлами следит каждый PHP-процесс, а не\nодна служба.",{"title":128,"path":167,"stem":168,"description":105},"\u002Fmodules\u002Fproblems\u002Fagent-rules","3.modules\u002F2.problems\u002F6.agent-rules",{"title":82,"path":170,"stem":171,"description":85},"\u002Fmodules\u002Fproblems\u002Fbuild-and-install","3.modules\u002F2.problems\u002F7.build-and-install",{"title":87,"path":173,"stem":174,"description":90},"\u002Fmodules\u002Fproblems\u002Fmodule-structure","3.modules\u002F2.problems\u002F8.module-structure",{"title":92,"path":176,"stem":177,"description":178},"\u002Fmodules\u002Fproblems\u002Fportal-check","3.modules\u002F2.problems\u002F9.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, меню,\nраскладка файлов, журнал событий, поведение при обновлении. Проверять это\nприходится руками — и лучше по списку, потому что забытый шаг находит не\nразработчик, а клиент.",{"title":180,"description":6,"path":181,"stem":182,"children":183},"shef.insync","\u002Fmodules\u002Finsync","3.modules\u002F3.insync\u002Findex",[184,186,191,194,198,203,208,213,218,222,227,232,235],{"title":180,"path":181,"stem":182,"description":185},"агенты, импорт, API-клиенты, модели",{"title":187,"path":188,"stem":189,"description":190},"[`\\Shef\\InSync\\Agents`] Агенты","\u002Fmodules\u002Finsync\u002Fagents","3.modules\u002F3.insync\u002F1.agents","Агент импорта — наследник \\Shef\\InSync\\Agents\\AAgent. Описание агента для\nb_agent — \\Shef\\InSync\\Agents\\Entity, установку и управление берёт на себя\n\\Shef\\InSync\\Agents\\Manager.",{"title":87,"path":192,"stem":193,"description":90},"\u002Fmodules\u002Finsync\u002Fmodule-structure","3.modules\u002F3.insync\u002F10.module-structure",{"title":92,"path":195,"stem":196,"description":197},"\u002Fmodules\u002Finsync\u002Fportal-check","3.modules\u002F3.insync\u002F11.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, левое\nменю, раскладка компонентов, агенты, таблица импорта, поведение при\nобновлении. Проверять это приходится руками — и лучше по списку, потому что\nзабытый шаг находит не разработчик, а клиент.",{"title":199,"path":200,"stem":201,"description":202},"Безопасность","\u002Fmodules\u002Finsync\u002Fsecurity","3.modules\u002F3.insync\u002F12.security","Модуль даёт другим модулям заготовки для синхронизаций, и самые опасные места\nу него общие с ними: кто может запускать агенты и импорт, что ложится в каталоги\nимпорта, что уходит в SQL и в лог. Ниже — что держит модуль и что остаётся\nпроекту.",{"title":204,"path":205,"stem":206,"description":207},"[`\\Shef\\InSync\\Sync`] Импорт","\u002Fmodules\u002Finsync\u002Fimport","3.modules\u002F3.insync\u002F2.import","Импорт идёт в два шага через таблицу импорта \\Shef\\InSync\\Sync\\Model\\SyncTable\n(shef_insync_model):",{"title":209,"path":210,"stem":211,"description":212},"[`\\Shef\\InSync\\Api`] API","\u002Fmodules\u002Finsync\u002Fapi","3.modules\u002F3.insync\u002F3.api","Обращение к внешнему API по HTTP — наследник \\Shef\\InSync\\Api\\AConnector.",{"title":214,"path":215,"stem":216,"description":217},"[`\\Shef\\InSync\\TraitList\\Xml`] Парсинг XML","\u002Fmodules\u002Finsync\u002Fxml","3.modules\u002F3.insync\u002F4.xml","Разбор XML сделан через SbWereWolf\u002Fxml-navigator\n(статья на Хабре): XMLReader идёт по\nдокументу потоком, а каждый элемент с нужным тегом HierarchyComposer\nпревращает в массив — n имя, v значение, a атрибуты, s вложенные\nэлементы.",{"title":219,"path":220,"stem":221,"description":105},"Компоненты","\u002Fmodules\u002Finsync\u002Fcomponents","3.modules\u002F3.insync\u002F5.components",{"title":223,"path":224,"stem":225,"description":226},"Страницы","\u002Fmodules\u002Finsync\u002Fpage","3.modules\u002F3.insync\u002F6.page","Страницы модуля — в левом меню, штатным разделом intranet\n(Bitrix\\Intranet\\CustomSection): раздел «SH Импорт», код shinsync.\nВерхней панели и shef.uiclear больше нет.",{"title":228,"path":229,"stem":230,"description":231},"[`\\Shef\\InSync\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Finsync\u002Foptions","3.modules\u002F3.insync\u002F7.options","Опции для страницы настроек модуля импорта (на ShOptionsConfig из\nshef.options): добавьте их во вкладку своего options_conf.php.",{"title":128,"path":233,"stem":234,"description":105},"\u002Fmodules\u002Finsync\u002Fagent-rules","3.modules\u002F3.insync\u002F8.agent-rules",{"title":82,"path":236,"stem":237,"description":85},"\u002Fmodules\u002Finsync\u002Fbuild-and-install","3.modules\u002F3.insync\u002F9.build-and-install",{"id":239,"title":144,"body":240,"description":105,"extension":711,"meta":712,"navigation":713,"path":145,"rawbody":714,"seo":715,"stem":146,"__hash__":716},"docs\u002F3.modules\u002F2.problems\u002F10.security.md",{"type":241,"value":242,"toc":701},"minimark",[243,248,262,307,310,329,334,341,399,406,413,417,428,464,499,503,513,555,570,589,593,603,630,640,644,656,663,667,676,685,697],[244,245,247],"h2",{"id":246},"логи-лежат-вне-корня-сайта","Логи лежат вне корня сайта",[249,250,251,252,256,257,261],"p",{},"Каталог логов — ",[253,254,255],"code",{},"\\Shef\\Problems\\Main\\Constants::getLogDir()",". По умолчанию он\nна уровень ",[258,259,260],"strong",{},"выше"," корня сайта:",[263,264,265,278],"table",{},[266,267,268],"thead",{},[269,270,271,275],"tr",{},[272,273,274],"th",{},"корень сайта",[272,276,277],{},"каталог логов",[279,280,281,295],"tbody",{},[269,282,283,290],{},[284,285,286,289],"td",{},[253,287,288],{},"\u002Fhome\u002Fbitrix\u002Fwww"," (BitrixVM)",[284,291,292],{},[253,293,294],{},"\u002Fhome\u002Fbitrix\u002Fsh_log",[269,296,297,302],{},[284,298,299],{},[253,300,301],{},"\u002Fvar\u002Fwww\u002Fportal",[284,303,304],{},[253,305,306],{},"\u002Fvar\u002Fwww\u002Fsh_log",[249,308,309],{},"Что в логах: трассировки с путями, сообщения исключений, контекст записей — а\nв контекст попадают поля заказов, лидов, ответы внешних систем. Вне корня сайта\nвеб-сервер эти файлы не отдаёт, настраивать для этого ничего не нужно.",[249,311,312,313,316,317,320,321,324,325,328],{},"До 2.0.0 логи лежали в ",[253,314,315],{},"\u002Flocal\u002Fsh_log"," — под корнем сайта, и ",[253,318,319],{},"\u002Flocal\u002F"," в\nстандартной поставке BitrixVM не закрыт. Имена файлов предсказуемы\n(",[253,322,323],{},"log.log",", ",[253,326,327],{},"sh_problems_sale.log","), так что скачать их мог любой.",[330,331,333],"h3",{"id":332},"свой-каталог","Свой каталог",[249,335,336,337,340],{},"Если рядом с корнем сайта писать нельзя или логи нужны в другом месте, проект\nзадаёт каталог в ",[253,338,339],{},"\u002Fbitrix\u002F.settings_extra.php",":",[342,343,347],"pre",{"className":344,"code":345,"language":346,"meta":105,"style":105},"language-php shiki shiki-themes material-theme-lighter github-light github-dark","return [\n    'shef.problems' => [\n        'value' => [\n            'logDir' => '\u002Fvar\u002Flog\u002Fportal',\n        ],\n        'readonly' => true,\n    ],\n];\n","php",[253,348,349,357,363,369,375,381,387,393],{"__ignoreMap":105},[350,351,354],"span",{"class":352,"line":353},"line",1,[350,355,356],{},"return [\n",[350,358,360],{"class":352,"line":359},2,[350,361,362],{},"    'shef.problems' => [\n",[350,364,366],{"class":352,"line":365},3,[350,367,368],{},"        'value' => [\n",[350,370,372],{"class":352,"line":371},4,[350,373,374],{},"            'logDir' => '\u002Fvar\u002Flog\u002Fportal',\n",[350,376,378],{"class":352,"line":377},5,[350,379,380],{},"        ],\n",[350,382,384],{"class":352,"line":383},6,[350,385,386],{},"        'readonly' => true,\n",[350,388,390],{"class":352,"line":389},7,[350,391,392],{},"    ],\n",[350,394,396],{"class":352,"line":395},8,[350,397,398],{},"];\n",[249,400,401,402,405],{},"Принимается ",[258,403,404],{},"только абсолютный путь",". Относительный зависел бы от текущего\nкаталога процесса: агент из cron писал бы в одно место, а страница — в другое.\nЧто-то кроме абсолютного пути — каталог по умолчанию.",[249,407,408,409,412],{},"Каталог обязан быть ",[258,410,411],{},"вне корня сайта"," — модуль это не проверяет, это решение\nпроекта.",[330,414,416],{"id":415},"права-и-open_basedir","Права и open_basedir",[249,418,419,420,423,424,427],{},"Каталог создаётся сам при первой записи — если пользователь PHP может писать в\nего родителя. На BitrixVM ",[253,421,422],{},"\u002Fhome\u002Fbitrix"," принадлежит ",[253,425,426],{},"bitrix",", всё работает из\nкоробки. В другом окружении создайте каталог заранее:",[342,429,433],{"className":430,"code":431,"language":432,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","sudo mkdir \u002Fvar\u002Fwww\u002Fsh_log && sudo chown www-data: \u002Fvar\u002Fwww\u002Fsh_log\n","bash",[253,434,435],{"__ignoreMap":105},[350,436,437,441,445,448,452,455,458,461],{"class":352,"line":353},[350,438,440],{"class":439},"sbgvK","sudo",[350,442,444],{"class":443},"s_sjI"," mkdir",[350,446,447],{"class":443}," \u002Fvar\u002Fwww\u002Fsh_log",[350,449,451],{"class":450},"sP7_E"," &&",[350,453,454],{"class":439}," sudo",[350,456,457],{"class":443}," chown",[350,459,460],{"class":443}," www-data:",[350,462,463],{"class":443}," \u002Fvar\u002Fwww\u002Fsh_log\n",[249,465,466,467,470,471,474,475,478,479,482,483,486,487,490,491,494,495,498],{},"Если в PHP задан ",[253,468,469],{},"open_basedir",", каталог логов должен в него входить — иначе\nзапись в файл не пройдёт. В логе PHP появятся предупреждения ",[253,472,473],{},"open_basedir restriction in effect"," от самого Monolog и строка ",[253,476,477],{},"shef.problems: запись логгера … не прошла: UnexpectedValueException …",". Вызывающий код при этом не\nпадает — у логгеров модуля (сервисы из ",[253,480,481],{},".settings.php",", фабрика проблем).\n",[253,484,485],{},"_log()"," и ",[253,488,489],{},"_log1()"," пишут мимо Monolog, через ",[253,492,493],{},"File::putFileContents()",", и\nстроки ",[253,496,497],{},"shef.problems:"," от них не будет.",[330,500,502],{"id":501},"после-обновления-с-1x","После обновления с 1.x",[249,504,505,506,508,509,512],{},"Старый каталог ",[253,507,315],{}," модуль не трогает: в нём ваши данные. Но он\n",[258,510,511],{},"по-прежнему открыт"," веб-серверу. Перенесите нужное и удалите его:",[342,514,516],{"className":430,"code":515,"language":432,"meta":105,"style":105},"mv \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\u002F*.log \u002Fhome\u002Fbitrix\u002Fsh_log\u002F 2>\u002Fdev\u002Fnull\nrm -r \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\n",[253,517,518,543],{"__ignoreMap":105},[350,519,520,523,526,530,533,536,540],{"class":352,"line":353},[350,521,522],{"class":439},"mv",[350,524,525],{"class":443}," \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\u002F",[350,527,529],{"class":528},"s_hVV","*",[350,531,532],{"class":443},".log",[350,534,535],{"class":443}," \u002Fhome\u002Fbitrix\u002Fsh_log\u002F",[350,537,539],{"class":538},"smGrS"," 2>",[350,541,542],{"class":443},"\u002Fdev\u002Fnull\n",[350,544,545,548,552],{"class":352,"line":359},[350,546,547],{"class":439},"rm",[350,549,551],{"class":550},"stzsN"," -r",[350,553,554],{"class":443}," \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\n",[249,556,557,558,561,562,569],{},"И поправьте пути в ",[253,559,560],{},"\u002Fetc\u002Flogrotate.d\u002F",", если настраивали ротацию —\n",[563,564,568],"a",{"href":565,"rel":566},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Flogrotate\u002Flogrotate-b24-shef-problems",[567],"nofollow","пример",".",[249,571,572,573,576,577,580,581,584,585,588],{},"Если проект кладёт в каталог логов ",[253,574,575],{},"exceptions.log"," (",[253,578,579],{},"exception_handling"," в\n",[253,582,583],{},"\u002Fbitrix\u002F.settings.php",") или ",[253,586,587],{},"mailer.log",", перенесите и эти пути.",[244,590,592],{"id":591},"логи-смотреть-через-админку","Логи смотреть через админку",[249,594,595,596,576,599,602],{},"Раз каталог вне корня сайта, ни прямая ссылка, ни файловый менеджер Битрикса до\nнего не дотянутся. Смотреть логи — страницей модуля\n",[253,597,598],{},"\u002Fbitrix\u002Fadmin\u002Fshef_problems_logs.php",[258,600,601],{},"Настройки → Учёт проблем → Логи","):",[604,605,606,610,624,627],"ul",{},[607,608,609],"li",{},"только администратору;",[607,611,612,613,616,617,620,621,623],{},"имя файла из запроса проверяется дважды — по шаблону (буквы, цифры, ",[253,614,615],{},"_",",\n",[253,618,619],{},"-",", расширение ",[253,622,532],{},", номер ротации) и после разрешения пути: файл обязан\nлежать внутри каталога логов, символическая ссылка наружу отсекается;",[607,625,626],{},"показывается конец файла, не больше 256 КБ;",[607,628,629],{},"содержимое экранируется.",[249,631,632,633,636,637,569],{},"Держит это ",[253,634,635],{},"\\Shef\\Problems\\Main\\LogFiles",", сторожит ",[253,638,639],{},"tests\u002Flogfiles_test.php",[244,641,643],{"id":642},"вывод-на-экран-экранируется","Вывод на экран экранируется",[249,645,646,324,649,486,652,655],{},[253,647,648],{},"_pr()",[253,650,651],{},"PrHandler",[253,653,654],{},"PrHtmlHandler"," печатают запись прямо в страницу. Всё,\nчто пришло из записи, экранируется: в сообщение и контекст попадает в том числе\nввод посетителя, а смотрит на вывод администратор — непроэкранированный вывод\nбыл бы хранимым XSS в его браузере. До 2.0.0 так и было.",[249,657,658,659,662],{},"Показывать вывод всем (",[253,660,661],{},"isShowForAll: true",") — только на стенде: там может\nоказаться что угодно из контекста.",[244,664,666],{"id":665},"ключи-и-токены-не-в-код","Ключи и токены — не в код",[249,668,669,670,672,673,569],{},"Обработчики с ключами (Telegram, Slack, почта) настраиваются в\n",[253,671,339],{},", который не уезжает в репозиторий проекта, — см.\n",[563,674,675],{"href":159},"Monolog",[249,677,678,681,682],{},[563,679,680],{"href":163},"← Ротация логов"," | ",[563,683,684],{"href":133},"↑ Содержание",[686,687,688],"note",{},[249,689,690,691,696],{},"Источник: ",[563,692,695],{"href":693,"rel":694},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fsecurity.md",[567],"problems\u002Fdocs\u002Fsecurity.md"," — правки туда, сайт пересобирается сам.",[698,699,700],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":105,"searchDepth":365,"depth":365,"links":702},[703,708,709,710],{"id":246,"depth":359,"text":247,"children":704},[705,706,707],{"id":332,"depth":365,"text":333},{"id":415,"depth":365,"text":416},{"id":501,"depth":365,"text":502},{"id":591,"depth":359,"text":592},{"id":642,"depth":359,"text":643},{"id":665,"depth":359,"text":666},"md",{},true,"---\ntitle: \"Безопасность логов\"\n---\n\n## Логи лежат вне корня сайта\n\nКаталог логов — `\\Shef\\Problems\\Main\\Constants::getLogDir()`. По умолчанию он\nна уровень **выше** корня сайта:\n\n| корень сайта | каталог логов |\n|---|---|\n| `\u002Fhome\u002Fbitrix\u002Fwww` (BitrixVM) | `\u002Fhome\u002Fbitrix\u002Fsh_log` |\n| `\u002Fvar\u002Fwww\u002Fportal` | `\u002Fvar\u002Fwww\u002Fsh_log` |\n\nЧто в логах: трассировки с путями, сообщения исключений, контекст записей — а\nв контекст попадают поля заказов, лидов, ответы внешних систем. Вне корня сайта\nвеб-сервер эти файлы не отдаёт, настраивать для этого ничего не нужно.\n\nДо 2.0.0 логи лежали в `\u002Flocal\u002Fsh_log` — под корнем сайта, и `\u002Flocal\u002F` в\nстандартной поставке BitrixVM не закрыт. Имена файлов предсказуемы\n(`log.log`, `sh_problems_sale.log`), так что скачать их мог любой.\n\n### Свой каталог\n\nЕсли рядом с корнем сайта писать нельзя или логи нужны в другом месте, проект\nзадаёт каталог в `\u002Fbitrix\u002F.settings_extra.php`:\n\n```php\nreturn [\n\t'shef.problems' => [\n\t\t'value' => [\n\t\t\t'logDir' => '\u002Fvar\u002Flog\u002Fportal',\n\t\t],\n\t\t'readonly' => true,\n\t],\n];\n```\n\nПринимается **только абсолютный путь**. Относительный зависел бы от текущего\nкаталога процесса: агент из cron писал бы в одно место, а страница — в другое.\nЧто-то кроме абсолютного пути — каталог по умолчанию.\n\nКаталог обязан быть **вне корня сайта** — модуль это не проверяет, это решение\nпроекта.\n\n### Права и open_basedir\n\nКаталог создаётся сам при первой записи — если пользователь PHP может писать в\nего родителя. На BitrixVM `\u002Fhome\u002Fbitrix` принадлежит `bitrix`, всё работает из\nкоробки. В другом окружении создайте каталог заранее:\n\n```bash\nsudo mkdir \u002Fvar\u002Fwww\u002Fsh_log && sudo chown www-data: \u002Fvar\u002Fwww\u002Fsh_log\n```\n\nЕсли в PHP задан `open_basedir`, каталог логов должен в него входить — иначе\nзапись в файл не пройдёт. В логе PHP появятся предупреждения `open_basedir\nrestriction in effect` от самого Monolog и строка `shef.problems: запись\nлоггера … не прошла: UnexpectedValueException …`. Вызывающий код при этом не\nпадает — у логгеров модуля (сервисы из `.settings.php`, фабрика проблем).\n`_log()` и `_log1()` пишут мимо Monolog, через `File::putFileContents()`, и\nстроки `shef.problems:` от них не будет.\n\n### После обновления с 1.x\n\nСтарый каталог `\u002Flocal\u002Fsh_log` модуль не трогает: в нём ваши данные. Но он\n**по-прежнему открыт** веб-серверу. Перенесите нужное и удалите его:\n\n```bash\nmv \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\u002F*.log \u002Fhome\u002Fbitrix\u002Fsh_log\u002F 2>\u002Fdev\u002Fnull\nrm -r \u002Fhome\u002Fbitrix\u002Fwww\u002Flocal\u002Fsh_log\n```\n\nИ поправьте пути в `\u002Fetc\u002Flogrotate.d\u002F`, если настраивали ротацию —\n[пример](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Flogrotate\u002Flogrotate-b24-shef-problems).\n\nЕсли проект кладёт в каталог логов `exceptions.log` (`exception_handling` в\n`\u002Fbitrix\u002F.settings.php`) или `mailer.log`, перенесите и эти пути.\n\n## Логи смотреть через админку\n\nРаз каталог вне корня сайта, ни прямая ссылка, ни файловый менеджер Битрикса до\nнего не дотянутся. Смотреть логи — страницей модуля\n`\u002Fbitrix\u002Fadmin\u002Fshef_problems_logs.php` (**Настройки → Учёт проблем → Логи**):\n\n* только администратору;\n* имя файла из запроса проверяется дважды — по шаблону (буквы, цифры, `_`,\n  `-`, расширение `.log`, номер ротации) и после разрешения пути: файл обязан\n  лежать внутри каталога логов, символическая ссылка наружу отсекается;\n* показывается конец файла, не больше 256 КБ;\n* содержимое экранируется.\n\nДержит это `\\Shef\\Problems\\Main\\LogFiles`, сторожит `tests\u002Flogfiles_test.php`.\n\n## Вывод на экран экранируется\n\n`_pr()`, `PrHandler` и `PrHtmlHandler` печатают запись прямо в страницу. Всё,\nчто пришло из записи, экранируется: в сообщение и контекст попадает в том числе\nввод посетителя, а смотрит на вывод администратор — непроэкранированный вывод\nбыл бы хранимым XSS в его браузере. До 2.0.0 так и было.\n\nПоказывать вывод всем (`isShowForAll: true`) — только на стенде: там может\nоказаться что угодно из контекста.\n\n## Ключи и токены — не в код\n\nОбработчики с ключами (Telegram, Slack, почта) настраиваются в\n`\u002Fbitrix\u002F.settings_extra.php`, который не уезжает в репозиторий проекта, — см.\n[Monolog](\u002Fmodules\u002Fproblems\u002Fmonolog).\n\n[← Ротация логов](\u002Fmodules\u002Fproblems\u002Flogrotate) | [↑ Содержание](\u002Fmodules\u002Fproblems)\n\n::note\nИсточник: [problems\u002Fdocs\u002Fsecurity.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fsecurity.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":144,"description":105},"4epKnWQnnpiVHzPFz1Yd0-p3LhPygV2Cm-l7KwBhkvg",[718,719],{"title":139,"path":140,"stem":141,"description":142,"children":-1},{"title":148,"path":149,"stem":150,"description":151,"children":-1},1790857269802]