#javascript
Вопрос:
У меня есть страница конфигурации пользователя на странице настроек user-config
, и страница открывается JS
<a onclick="window.open("@/@user-config.php", "User Config", "directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=350,height=450");">Open User Config Window</a>
Его не следует открывать напрямую,
Итак, есть ли способ определить, открыто ли окно JS или нет
Спасибо 😐
Комментарии:
1. Проверьте, существует ли window.opener у вас
user-config.php
. Если страница открыта напрямую, у вас не будет открывателя окон.2. Вы могли бы проверить, есть ли у всплывающего
opener
окна набор, но это также имело бы место, если бы оно было открыто по ссылке с обычным набором href target=» пустой». _»Его не следует открывать напрямую» — почему бы и нет, какой именно ущерб это может нанести?3. Я не хочу быть «тем парнем»🙂, но пользователи будут делать то, что делают пользователи. Почему бы не сделать возможным открыть его напрямую?
Ответ №1:
Для меня лучше всего было бы разрешить открывать страницу напрямую. Пользователи будут делать то, что делают пользователи.
Но если вы не хотите этого делать (или не можете по каким-то причинам), то первое, что приходит на ум, — это иметь JavaScript открыть окно без URL-адреса (например, about:blank
), а затем заполнить это окно с результатом делаю вызов Ajax с заголовка, который не находится на прямой запрос (если кто-то делает прямой запрос с почтальоном или что-то, и беспокоясь о том, что это, наверное, перебор). PHP может проверить заголовок. Это выглядит примерно так:
function openUserConfig() {
const win = window.open("about:blank", "User Config", "directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=350,height=450");
win.document.write("<em>Loading...</em>");
win.document.close();
fetch("@/@user-config.php", {
headers: {
"The-Header": "Header Value",
}
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error ${response.status}`);
}
return response.text();
})
.then(html => {
win.document.write(html);
win.document.close();
})
.catch(() => {
win.document.write("<strong>Error loading user config</strong>"); // Or whatever
win.document.close();
});
}
В сочетании с PHP, чтобы проверить заголовок и отправить обратно (например) ответ 403, если его там нет.
Обратите внимание, что для возвращаемой разметки документа @/@user-config.php
также потребуется base
элемент, чтобы относительные URL-адреса на странице (для CSS, JavaScript, шрифтов; ссылки в тексте) разрешались правильно. (Или сделайте все URL-адреса на странице абсолютными, или встроите все.)
Но опять же, я бы предпочел сделать так, чтобы вы могли открыть его напрямую, если это возможно.
Комментарии:
1. У меня проблема в том , что связанный CSS
@user-config.php
не работает2. @N_R01 — Да, для этого потребуются либо абсолютные URL-адреса для этих вещей, либо
base
элемент (или чтобы все это было встроено).3. @N_R01 — Да, я понял проблему, см. Комментарий выше.
4. Спасибо, проблема была исправлена другим способом, я использовал
<?=$location?>../../../../c8kj48/css/cp-main.css
PHP, спасибо, 🙂
Ответ №2:
Вы можете отправить запрос на сервер перед вызовом window.open()
, чтобы сообщить серверу, чтобы он разрешил этому пользователю перейти на страницу конфигурации, в противном случае, если кто-то попытается войти на эту страницу без отправки запроса на разрешение, он должен получить сообщение об ошибке, так как у него нет разрешения