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