Conversation
fayzetwin1
left a comment
There was a problem hiding this comment.
в целом все круто, но мне кажется стоит кое-что подправить
|
|
||
| if (is_string($returnTo) && $returnTo !== "") { | ||
| $parsedReturnTo = parse_url($returnTo); | ||
| if ($parsedReturnTo !== false && !isset($parsedReturnTo["host"]) && str_starts_with($returnTo, "/") && !str_starts_with($returnTo, "//")) { |
There was a problem hiding this comment.
я бы предпочел брать путь более строгим путем или проверять регуляркой типа:
!str_starts_with($returnTo, '//') && !str_starts_with($returnTo, '/\\')
насколько я помню parse_url в PHP в некоторых случаях работает не всегда точно
то есть, грубо говоря, я бы добавил еще проверку на !str_starts_with($returnTo, "/\\")
| $parsedReturnTo = parse_url($returnTo); | ||
| if ($parsedReturnTo !== false && !isset($parsedReturnTo["host"]) && str_starts_with($returnTo, "/") && !str_starts_with($returnTo, "//")) { | ||
| $redirect = $returnTo; | ||
| } elseif ($parsedReturnTo !== false && isset($parsedReturnTo["host"])) { |
There was a problem hiding this comment.
по сути оно делает то же самое - берет сугубо $parsedReturnTo["path"] и отбрасывает хост
для простоты я считаю можно просто разрешать только безопасные относительные пути без протоколов и доменов
к примеру:
if (
is_string($returnTo)
&& str_starts_with($returnTo, "/")
&& !str_starts_with($returnTo, "//")
&& !str_starts_with($returnTo, "/\\")
) {
$parsed = parse_url($returnTo);
if ($parsed !== false && !isset($parsed["scheme"]) && !isset($parsed["host"])) {
$redirect =$returnTo;
}
}| <div n:if="isset($thisUser) && $thisUser->getId() === $photo->getOwner()->getId()"> | ||
| <a href="/photo{$photo->getPrettyId()}/edit" class="profile_link" style="display:block;width:96%;">{_edit}</a> | ||
| <a id="_photoDelete" href="/photo{$photo->getPrettyId()}/delete" class="profile_link" style="display:block;width:96%;">{_delete}</a> | ||
| <a id="_photoDelete" href="/photo{$photo->getPrettyId()}/delete{ifset $_SERVER['HTTP_REFERER']}?return_to={rawurlencode($_SERVER['HTTP_REFERER'])}{/ifset}" class="profile_link" style="display:block;width:96%;">{_delete}</a> |
There was a problem hiding this comment.
реферер может содержать чисто в теории что-то лишнее (внешний сайт условно говоря), и ссылка в шаблоне может тогда содержать лишний мусор
мне кажется реферер можно определять прямо в PhotosPresenter через $this->getHttpRequest()->getReferer() как fallback если мы не передали return_to
|
..или если не хочется делать велосипед (а его и не надо делать) и если баг был только в том, что /id0 редиректит в ленту из-за настроек главной страницы, то весь этот блок с query-параметрами и валидацией хостов лишний то есть заменить в fallback хардкод на реальный url овнера: if (!is_null($album =$photo->getAlbum())) {
$redirect = '/album' .$album->getPrettyId();
} else {
$redirect =$photo->getOwner()->getURL();
} |
|
если так можно конечно ибо я сам хз чуть-чуть |
|
я так понял, fayzetwin, я изучу твои комментарии и постараюсь поправить этот ужас |
если в настройках основной страницы стояла лента, при удалении фото со страницы, отправляло на
/feedвместо страницы юзера из-за того, что/id0отправляет в лентуне знаю, является ли поведение отправки
/id0в ленту при значенииMain page - My feed, вместо страницы пользователя (хз, как будто должно быть в любом случае id0 = текущий юзер, не?)im so fucking confused