検索

ホームページ  >  に質問  >  本文

JavaScript を使用せずに信頼できない入力を CSS カスタム プロパティに安全に割り当てる: ガイド

文字列キーと文字列値のオブジェクトがあり、それらを CSS カスタム プロパティとしてサーバー生成の HTML に書き込みたいとします。どうすれば安全にこれを行うことができますか?

セキュリティとは

わかりやすくするために、[a-zA-Z0-9_-] クラスの文字のみを許可するようにキーを制限します。

CSS 仕様を読んで個人的なテストを行った結果、次の手順に従って値を取得すると、大幅に進歩できると思います。

この CSS 構文仕様に基づいて上記の手順を思いつきました

コンテキストとして、これらのプロパティは、他の場所に挿入するユーザー定義スタイルで使用できますが、同じオブジェクトがテンプレート内のテンプレート データとしても使用されるため、コンテンツとして意図された文字列や CSS としてミックスインに期待される文字列が含まれる可能性があります。変数。上記のアルゴリズムは、CSS で役立つ可能性のあるキーと値のペアを大量に破棄するリスクを冒すことなく、非常にシンプルであるという良いバランスをとっているように感じます (CSS への将来の追加も考慮していますが、そうでないことを確認したいと考えています)何かが足りないわけではありません。


これは私が達成しようとしていることを示す JS コードです。

obj は問題のオブジェクトであり、preprocessPairs はオブジェクトを取得して前処理し、上記の手順で説明したように値を削除/再フォーマットする関数です。 リーリー

したがって、次のようなオブジェクトが与えられた場合

リーリー

CSS を次のようにしたい:

リーリー

--theme-title は CSS で使用すると非常に役に立たないカスタム変数ですが、CSS は理解できないプロパティを無視するため、実際にはスタイルシートを破壊しません。

P粉356361722P粉356361722484日前749

全員に返信(1)返信します

  • P粉898107874

    P粉8981078742023-09-07 21:34:20

    実際には、特定の言語に依存せずに正規表現やその他のアルゴリズムを使用することもできます。それが必要なものであることを願っています。

    オブジェクト キーが [a-zA-Z0-9_-] 内にあると宣言することで、何らかの方法で値を解析する必要があります。

    価値モデル

    そこで、カテゴリに分類して、何が見つかるかを確認します (わかりやすくするために、若干簡略化されている可能性があります):

    1. '.*' (アポストロフィで囲まれた文字列、貪欲)
    2. ".*" (二重引用符で囲まれた文字列、貪欲)
    3. [ -]?\d (\.\d )?(%|[A-z] )? (整数と小数、オプションのパーセンテージまたは単位付き)
    4. #[0-9A-f]{3,6}(カラー)
    5. [A-z0-9_-] (キーワード、名前付きの色、「使いやすさ」など)
    6. ([\w-] )\([^)] \) (url()calc()> などに似た関数。 )

    最初のフィルター

    これらのパターンを特定する前に、何らかのフィルタリングを実行できることは想像できます。おそらく最初に値文字列をトリミングします。前述したように、<# と # は、上記のモードのように表示されないため、preprocessPairs() 関数の先頭でエスケープできます。エスケープされていないセミコロンをどこにも表示したくない場合は、セミコロンをエスケープすることもできます。

    認識パターン

    その後、 内でこれらのパターンを識別することを試みることができ、パターンごとにフィルタリングを再度実行する必要がある場合があります。これらのパターンはいくつか (または 2 つ) の空白文字で区切られることが予想されます。

    エスケープされた改行である複数行文字列のサポートを含めても問題ありません。

    ロケール

    フィルタリングするコンテキストが少なくとも 2 つあることを認識する必要があります (HTML と CSS)。