2

方法が必要です:

  1. ユーザーが ONLY<strong><p>タグを使用できるようにします。

  2. ユーザーがこれらのタグで CSS を使用することを避けるため (たとえば、これは動作してはなりません: <p style="margin:1000px;"> hello </p>)。

  3. XSSを避ける​​ために。

    • htmlspecialcharshtml エンティティのすべてのタグを変換するため、十分ではありません。

    • strip_tagタグで CSS を許可するため、十分ではありません。

では、これを行うためにどの PHP 関数を使用できますか?

HTML purifier のような外部ライブラリを使用したくありません。

4

3 に答える 3

2

私が考えることができる最良のアイデア (必要な境界内で) は、テキストのカスタム文字列を使用し、<p>出力<strong>str_replaceHTML タグと共に使用することです。このようにして、彼らは危険なものを注入することはできません。

投稿を書いているときに多くのフォーラム Web サイトでこれを目にします。ユーザーが段落アイコンと太字アイコンをクリックすると[p][/p]<p></p>. 次に、出力 str_replace [p]with<p>および[/p]with で</p>。カスタム CSS やスクリプトを挿入すると、string_replaceは失敗し、ブラウザーがレンダリングする HTML を出力しません。

于 2013-05-07T11:32:25.360 に答える
2

この非常に限られた HTML のサブセットに対して、独自の小さなレクサーとパーサーを作成できます。

$input = '…';
$tokens = preg_split('~(</?(?:p|strong)\s*>)~', $input, -1, PREG_SPLIT_DELIM_CAPTURE);
var_dump($tokens);

foreach ($tokens as $i => &$token) {
    if ($i % 2 === 0) {
        // text
        $token = htmlspecialchars($token);
    } else {
        // tag
    }
}
$output = implode('', $tokens);
于 2013-05-07T18:42:42.473 に答える
0

Web は、まさにこれらの目的のために、MarkDown 言語のようなソリューションを採用しました。

おそらく、クライアント側に Markdown エディターを実装し、サーバー側に Markdown デコーダーを実装する必要があります。XSS / CSS の観点から、ユーザーがテキストをフォーマットすることは許可しますが、ブロックします。

http://daringfireball.net/projects/markdown/

K.

于 2013-05-07T20:29:10.907 に答える