このドキュメントに付属するファイルは、このページ、または「ファイルのダウンロード」の「文字処理」セクションでダウンロードできます。このドキュメントでは、書式設定されたユーザー入力を安全に表示する方法について説明します。サニタイズされていない出力の危険性について説明し、フォーマットされた出力を表示する安全な方法を紹介します。
フィルタリングされた出力の危険性はありません
ユーザー入力を取得して表示するだけの場合、送信された入力ボックスに JavaScript スクリプトを悪意を持って埋め込むことができるため、出力ページが破損する可能性があります:
これは私のコメントです
<。 script language="javascript:
alert('Do something bad here!')">
このように、ユーザーに悪意がない場合でも、テーブルが突然中断されるなど、HTML ステートメントの一部が破壊されます。 、またはページの表示が不完全です。
フォーマットされていないテキストのみを表示する
これは最も簡単な解決策であり、ユーザーが送信した情報をフォーマットされていないテキストとして表示するだけです。 htmlspecialchars() 関数を使用して、すべての文字を HTML エンコーディングに変換します。
たとえば、 は に変換され、不適切なタイミングで予期しない HTML タグが出力されなくなります。
これは、ユーザーが書式設定されていないテキスト コンテンツのみを気にする場合に適したソリューションです。ただし、フォーマット機能を追加した方がよいでしょう。
カスタム マークアップ タグによる書式設定
書式設定用のユーザー独自のタグ
ユーザーが使用できる特別なタグを提供できます。たとえば、表示を強調するために [b]...[/b] の使用を許可できます。 ].. .[/i] 斜体で表示されます。単純な検索と置換操作を実行します: $output = str_replace("[b]", "", $output);
$output = str_replace("[ i] ", "
もう少し改良して、ユーザーがリンクを入力できるようにすることができます。たとえば、ユーザーは [link="url"]...[/link] を入力できます。これを ステートメントに変換します
単純な検索と置換の場合は、置換に正規表現を使用する必要があります:
$output = ereg_replace('[link="([[:graph:]]+)"]', '
ereg_replace() の実行は次のとおりです:
[link="..."] が表示される文字列を検索し、それを [[:graph: ]] は空でない文字を意味します。正規表現については関連記事を参照してください。
outputlib.php の format_output() 関数は、これらのタグの変換を提供します。全体的な原理は次のとおりです。
htmlspecialchars() を呼び出して、HTML タグを特別なエンコーディングに変換し、表示すべきでない HTML タグを除外します。次に、一連のカスタム タグを対応する HTML タグに変換します。
以下のソースコードをご覧ください:
<?php
function format_output($output) {
/*************************************************** ************************
* 生の文字列 ($output) を取得し、同様のマークアップを取り除いた特別な
* を使用して出力用にフォーマットします。 HTML へ
*********************************************** *****************************/
$output = htmlspecialchars(stripslashes($output));
/* new段落 */
$output = str_replace('[p]', '<p>', $output);
/* 太字 */
$output = str_replace('[b]', '', $output);
$output = str_replace('[/b]', '</b>', $output);
/*斜体 */
$output = str_replace('[i]', ' ;', $output);
$output = str_replace('[/i]', '</i>', $output);
/* フォーマット済み */
$output = str_replace('[pre]', '<pre>', $output);
$output = str_replace('[/pre]', '</pre>', $output);
/* インデントされたブロック (blockquote) */
$output = str_replace ('[indent]', '', $output);
', $output);
$output = str_replace('[/indent]', '
/* アンカー */
$ Output = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="\1"></a>',
/* リンク,リンク内で JavaScript が使用されないようにすることに注意してください */
$output = str_replace('[link="javascript', '[link=" javascript', $output);
$output = ereg_replace('[link="([[ :graph:]]+)"]', '<a href="\1">', $output);
$output = str_replace('[/link]', '</a>', $output );
return nl2br($output);
}
?>
HTML タグ文字列を生成するには、htmlspecialchars() 関数を呼び出す前ではなく、忘れずに置き換えてください。そうしないと、htmlspecialchars() を呼び出した後の労力が無駄になってしまいます。
変換後、二重引用符などの検索HTMLコードが置き換えられます
nl2br()関数は、htmlspecialchars()の後にもキャリッジリターンとラインフィード文字を
タグに変換します。
[links=""] を
outputlib.php
ブラウザでtest.phpを呼び出すと、format_output()の使用法が表示されます
通常のHTMLタグは使用できません。次の特別なタグに置き換えてください:
- これは[b]bold[です/b]
- これは [i]イタリック体[/i] です
- これは [link="http://www.phpbuilder.com"]リンク[/link] です
- これは [anchor=" test" ]アンカー、およびアンカーへの[link="#test"]リンク[/link]
[p]段落
[pre]フォーマット済み[/pre]
[indent]千鳥配置テキスト[/indent ]
これらはほんの一部のタグです。もちろん、必要に応じてタグを自由に追加できます
結論
結論
この議論では、ユーザー入力を安全に表示する方法を提供します。これは、次のプログラムで使用できます
コメントを残すボード
ユーザーからの提案
システムのお知らせ
BBSシステム