---
name: ui-position-not-presence
description: "«Кнопка есть» ≠ «кнопку видно»: замерять позицию в % от scrollHeight; и скрытый UI — не защита, если ручка под ним открыта"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: d0c6c5aa-4d05-42e2-a1f9-034482b88603
  modified: 2026-08-02T11:16:14.136Z
---

**2026-08-02, ЗБР.** Два дефекта одного корня — проверял наличие вместо доступности.

**1. Кнопка на 94% высоты страницы.** Владелец: «не вижу кнопки поделиться». Кнопку я добавил накануне и увидел на скриншоте — но поставил после тела экспертного отчёта. Замер на живом отчёте: страница **22 154 px**, кнопка публикации на **20 871 px (94%)**, проверка продавца на 97%. Двадцать шесть экранов юридического текста между человеком и действием равны отсутствию кнопки.

**Как проверять:** не «отрендерилось», а **на какой высоте от `scrollHeight`**. Дешёвый замер, ловит то, что визуальная проверка пропускает:
```js
document.querySelectorAll('button,a').forEach(el => {
  const y = el.getBoundingClientRect().top + scrollY;
  console.log(Math.round(100*y/document.documentElement.scrollHeight) + '% — ' + el.innerText);
});
```

**2. Спрятанная форма — не безопасность.** Я убрал строку ввода номера отчёта с публичной страницы, обосновав «незачем давать анонимную форму для перебора». Запрос без единой куки показал: эндпоинт авторизации не требует и отвечает карточкой. Форма не добавляла ни грамма защиты — она отсекала только честного покупателя. Защищал всё это время сам код: 10 знаков, ~2^49, лимит 20/мин.

**Правило:** прежде чем прятать UI ради защиты — дёрнуть ручку под ним запросом без сессии. Если открыта, скрытие UI это неудобство, а не мера.

См. [[zemlya_expert_report_bot_site_parity]], [[security_header_broke_own_iframe]], [[deployed_is_not_running]].
