PMs are accesible by admins if the admin has the link

I just found out that if someone sends a PM to other person. Let’s say from account joe to jane, and for some reason someone (logged in) finds out the right “topic ID” it can read the PM.

I know is kinda a edge-case and is rather difficult to find out, but automating some kind of scraper to cicle trough all the topics ID anyone could read all the PMs.

I found out because a user replied to the notification email, and I was able to click the link and read the PM in question.

I’m assuming you are a staff member on the forum? You should only be able to do this if you are staff. Staff should have the ability to audit PMs by default, and admins and those with access to the DB would have access to the raw messages anyway.

If you’re needing to provide a truly private system, there is the discourse-encrypt plugin which provides end-to-end encryption of messages.

9개의 좋아요

It’s not a necessity, just didn’t got a thought in that one.

I’ll test with a normal account and update this, just in case.

1개의 좋아요

This is only true for admins, not moderators, so I am editing your title which is incorrect. Moderators also only have access to PMs when they are flagged.

If this is a concern, demote yourself to moderator (by logging in under a different account to taste), or enable logging of PM visits by admins in your site settings.

5개의 좋아요

아주 멍청한 질문일 수도 있지만, 이 설정이 정확히 어디에 있나요? 우리는 안정판(이론적으로는 이 토글이 있어야 하지만)을 사용 중인데, 아무리 찾아도 찾을 수가 없습니다.

수정: 다른 관리자가 찾아냈습니다. “Users” 탭에 있는 “log personal messages views” 설정입니다. 제 생각에는 “Security” 탭에 있는 것이 더 적합할 것 같지만, 잠시 생각해보면 왜 거기에 있는지 이해가 됩니다.

2개의 좋아요

추가 질문 - 관리자가 메시지를 열어서 내용을 읽지 않았더라도, 특정 계정이 보유한 메시지를 확인했을 때 로그를 활성화할 수 있을까요?

저희 포럼의 맥락에서 보면, 관리자는 사용자가 참여 중인 특정 개인 메시지(PM)의 상세 정보만 확인해도 권한을 남용할 수 있습니다. 내용을 읽는 것보다 이름과 어떤 사용자가 접근 권한을 가지고 있는지 아는 것이 더 해로울 수 있으며, 현재 해당 설정이 활성화되어 있음에도 불구하고 이 정보는 로그에 기록되지 않습니다. 이상적으로는 이 문제를 수정하고, 관리자가 특정 메시지의 내용을 볼 때뿐만 아니라 사용자가 참여 중인 메시지를 확인하는 모든 시점에 로그를 기록하도록 하는 것이 바람직합니다.

1개의 좋아요

이를 위한 최선의 방법은 discourse-encrypt 플러그인을 통해 구현되는 끝에서 끝까지 암호화(end-to-end encryption)입니다.

관리자(Admins)는 포럼의 관리자이며 모든 데이터에 접근할 수 있습니다. 로그에 기록되지 않고 메시지 내용을 볼 수 있는 방법은 다음과 같이 다양합니다:

  • 백업 다운로드
  • 데이터 탐색기(data explorer)
  • 계정 위장(impersonation)
  • API 키 생성

사용자를 완전히 보호하기 위한 최선의 해결책은 암호화된 메시지 기능을 사용하는 것입니다. 관리자를 신뢰하지 못한다면, 그들은 관리자가 아니어야 합니다.

5개의 좋아요

제 이해로는 그 중 대부분이 로그 기록이 가능한 항목들이며, 실제로 우리가 필요한 것도 바로 그것이라고 생각합니다. 솔직히 말하면, 제가 실수로 사용자의 메시지 페이지를 보게 된 후 아무 일도 없었다는 듯이 넘어갈까 봐 제 자신을 믿기 어렵습니다. 그리고 우리 경우엔 그것이 해로울 수 있습니다(특히 보안 위험이라기보다는 무결성 위험이라고 보는 것이, 이 정보를 알게 된 사용자가 그 사실을 공개하고 관련 주제에서 스스로 회피하기만 하면 장기적인 피해는 발생하지 않는다는 전제에서요).

만약 다른 모든 동일한 데이터 접근 경로와 마찬가지로 로그에 기록된다면, 누가 실수로든 의도적으로든 이 작업을 수행한 후 보고하지 않는 것을 방지하는 데 훨씬 도움이 될 것입니다.

여러분이 나열한 항목들이 로그 기록이 불가능하다면 정말로 가능하도록 만들어야 하지만, 그렇다 하더라도 그것은 악의적인 관리자에는 도움이 되겠지만, 약간 부주의한 관리자에는 도움이 되지 않을 것입니다.

1개의 좋아요

사이트 테마를 사용하여 다른 사용자의 메시지 목록에서 메시지 제목을 숨기거나 흐리게 처리할 수 있습니다.

고의로 한 것이라면 이야기가 달라집니다.

이러한 감사 정보를 얻을 수 있는 다른 곳: 웹 서버 로그입니다.

이러한 정보를 기록하는 플러그인은 어렵지 않을 것이라고 생각하지만, 그것이 우리의 내부 로드맵에 포함되어야 하는지는 확신할 수 없습니다.

2개의 좋아요

자신의 메시지 목록도 흐려지지 않고 이 기능을 구현하는 방법은 무엇일까요? 제가 아는 한, CSS를 통해 자신의 메시지가 아닌 페이지에만 영향을 미치기 위해 사용하는, 현재 보고 있는 계정의 사용자명이 포함된 슬러그(slug)가 존재하지 않습니다.

1개의 좋아요

해당 페이지의 제목에 선택자를 사용할 수 있습니다. "Messages"는 내 메시지이고, "Username — Messages"는 다른 사람의 메시지입니다.

2개의 좋아요

제 주요 문제는 스크립트가 데이터가 업데이트되기 전에 데이터를 가져오는 것 같습니다. 즉, 페이지가 변경될 때 메타데이터는 읽을 수 있지만, 페이지 데이터가 업데이트되기 전에 업데이트가 이루어집니다.

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() =>{
        window.onload = determineUser();
    });
    
    function determineUser() {
        var pageURL = document.querySelector("meta[property='og:url']").getAttribute("content");
        var userPage = pageURL.includes("https://www.fortressoflies.com/u/");
        document.documentElement.style.setProperty('--currUsername', pageURL);
        
        if(userPage)
        {
            document.documentElement.style.setProperty('--lastUsername', pageURL);
        }
    }
</script>

결국 제 --currUsername은 먼저 업데이트되고, 그 다음에 메타 태그가 새로운 URL로 업데이트되므로, 제 --currUsername은 제가 실제로 보고 있는 페이지보다 항상 한 페이지 뒤처져 있습니다. “window.onload” 라인이 있든 없든 이 문제는 발생합니다.

여기서 제가 어디를 잘못하고 있는지 혹시 아시는 분 계신가요?

최종 목표는 기본적으로 현재 보고 있는 페이지에 따라 body에 클래스를 추가하고, 그에 따라 스타일을 적용하는 것입니다. 이렇게 하면 예를 들어 og:url 필드 대신 title 필드를 읽고, 이 경우 원하는 효과를 얻기 위해 body에 “myMessages” 클래스를 붙일 수 있습니다. 이론적으로는 말이죠.

1개의 좋아요

이건 정말 엉성하지만, 다음 코드는 JavaScript 함수가 0.02초 동안 대기하도록 강제하는 방식으로 작동하는 것으로 보입니다:

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() =>{
        window.onload = determineUser();
    });
    
    async function determineUser() {
        await sleep(50);
        var pageURL = document.querySelector("meta[property='og:url']").getAttribute("content");
        var userPage = pageURL.includes("https://www.fortressoflies.com/u/");
        document.documentElement.style.setProperty('--currUsername', pageURL);
        if(userPage)
        {
            document.documentElement.style.setProperty('--lastUsername', pageURL);
        }
    }
    
    function sleep(ms)
    {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
</script>

의도대로 작동하도록 만들 수 있을지 확인해 보겠습니다.

2개의 좋아요