PM はリンクを所持している管理者であればアクセス可能です

あるユーザーが他のユーザーに私的なメッセージ(PM)を送信する場合、例えばアカウント joe から jane へ送ったとします。その際、何らかの理由でログインした誰かが正しい「トピック ID」を特定できれば、その PM を読み取れてしまうことがわかりました。

これはどちらかといえば稀なケースであり、ID を特定するのは難しいとは承知していますが、トピック ID をすべて循環させるようなスクレイパーを自動化すれば、すべての PM を読み取られてしまう可能性があります。

私がこの問題を発見したきっかけは、あるユーザーが通知メールに返信した際、そのメール内のリンクをクリックすることで、対象の PM を閲覧できてしまったことです。

あなたはフォーラムのスタッフメンバーだと想定していますか?スタッフでなければ、この操作は行えないはずです。スタッフはデフォルトでPMの監査機能を持つべきであり、管理者やデータベースへのアクセス権を持つ人は、ともかくとして生メッセージにアクセスできるはずです。

もし、本当にプライベートなシステムを提供する必要がある場合は、メッセージのエンドツーエンド暗号化を提供するdiscourse-encryptプラグインがあります。

「いいね!」 9

必須ではありませんが、その点については考えが及ばなかったのです。
念のため、通常のアカウントでテストして、更新します。

「いいね!」 1

これは管理者にのみ当てはまり、モデレーターには当てはまりません。そのため、誤ったタイトルを編集しています。モデレーターも、PM がフラグ付けされた場合のみ PM にアクセスできます。

これが懸念事項であれば、別のアカウントでログインして自分自身をモデレーターに降格するか、サイト設定で管理者による PM 閲覧のログ記録を有効にしてください。

「いいね!」 5

おそらく愚かな質問ですが、この設定は具体的にどこにありますか?私たちは安定版(理論的にはこのトグルがあるはずです)を使用していますが、どうしても見つけられません。

編集: 他の管理者がそれを見つけました。それは「Users」タブにある「log personal messages views」です。セキュリティタブのものだと思いますが、少し考えるとそこに配置されている理由もわかります。

「いいね!」 2

フォローアップの質問です。管理者がメッセージの内容を開いて読んだかどうかに関わらず、アカウントが持つメッセージを管理者が閲覧した際にログを有効にすることは可能でしょうか?

私たちのフォーラムの文脈では、管理者が単にユーザーが関与している特定のプライベートメッセージの詳細を見るだけで、その権限を悪用する可能性があります。メッセージの内容を読むこと自体が、誰がアクセスできるか、またそのユーザーの名前を知ることよりも必ずしも有害ではありません。これは、その設定が有効になっているにも関わらず、現在ログに記録されていません。理想的には、これを修正し、管理者が特定のメッセージの内容を閲覧したときだけでなく、ユーザーが関与しているメッセージを閲覧したときもログに記録したいと考えています。

「いいね!」 1

これを実現する最善の方法は、エンドツーエンド暗号化を使用することです。これは、discourse-encrypt プラグインによって可能になります。

管理者はフォーラムの管理者であり、すべてのデータにアクセスできます。管理者がメッセージの内容をログに記録せずに表示する方法はたくさんあります。

  • バックアップのダウンロード
  • データエクスプローラー
  • なりすまし
  • APIキーの作成

ユーザーを完全に保護するには、暗号化されたメッセージングを使用するのが最善の解決策です。管理者を信頼できない場合は、管理者にすべきではありません。

「いいね!」 5

私の理解では、それらのほとんどはログに記録可能であり、それが私たちに必要なすべてです。正直なところ、ユーザーのメッセージページを誤って見てしまい、何事もなかったかのようにそのままにしてしまう自分自身を信用できるかどうかさえわかりません。それは私たちのケースでは有害になる可能性があります(特に、セキュリティリスクになるとは予想していませんが、整合性のリスクです。つまり、この知識にアクセスしたユーザーがそれについてオープンであり、関連トピックから身を引く限り、長期的な損害は発生しません)。

ログに記録されれば、他の方法で同じデータにアクセスできるすべての方法とともに、誰も誤ってまたは意図的にこれを行わないようにすることができます。

あなたがリストしたものがログに記録できないのであれば、それはそうされるべきですが、それでも悪意のある管理者に対してのみ役立ち、少し不注意な管理者には役立ちません。

「いいね!」 1

サイトのテーマを使用して、他のユーザーのメッセージ一覧でメッセージタイトルを非表示/隠蔽することができます。

意図的なものであれば、それは別の問題です。

この監査情報を取得できる他の場所:ウェブサーバーのログ。

この情報を記録するプラグインはそれほど難しくないと思いますが、内部ロードマップに含めるべきかどうかはわかりません。

「いいね!」 2

自分のメッセージ一覧も不明瞭にすることなく、これを実現するにはどうすればよいでしょうか? 私が知る限り、表示しているアカウントのユーザー名のスラッグはなく、CSSで自分自身以外のメッセージページのみに影響を与えることができます。

「いいね!」 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 は私が実際に見ているものより常に 1 ページ遅れています。これは、「window.onload」行があるかどうかに関係なく発生します。

何か間違っているところはありますか?

最終的な目標は、基本的に、どのページを見ているかに基づいて body にクラスを追加し、それに基づいてスタイルを設定することです。これにより、例えば、og:url フィールドではなく、そのタイトルフィールドを読み取ることができ、このインスタンスで目的の効果を得るために body に「myMessages」クラスを適用できます。理論上は。

「いいね!」 1

これは信じられないほどぎこちないですが、JavaScript関数を0.05秒間一時停止させることで、次のものが機能するようです。

<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