PHP+MySQLで掲示板のようなものを作成しています。
投稿の際、HTML形式が利用できるようにしたいと思っています。
概ね完成したのですが、HTML形式で投稿できるということは、PHPやjavascriptのコードを投稿すれば、それらの機能も利用されてしまうことに気がつきました。
たとえば、投稿フォームから
<?php
//悪意のあるコード
?>
と入力すれば、悪意のあるコードが実行されてしまいます。
そこで、投稿された部分のPHPやjavascriptだけを無効にする方法はないのでしょうか?
あるいは$や{や;など、PHPやjavascriptなどで使用する記号を受け付けないようにすればいいのでしょうか?
うまく説明できないので詳細は割愛しますが、「HTMLでの投稿をやめる」という選択ができないので悩んでいます。
どのような対処をすればいいのか、ご教授願います。
説明不足な点がありましたら、ご指摘いただければ補足します。
よろしくお願いいたします。
No.8
- 回答日時:
HTML Purifier というライブラリが、ほとんど解決してくれます。
<script>はもちろん、属性(onclickなど)もちゃんと解析して排除してくれます。
セキュリティというものに完璧はないので、おそらく抜け道は存在するはずです。ただ自分で小手先の知識でやるよりは、こういう専門に作られた方が安全だとは思います。
他の方がおっしゃってるように、PHP側でeval()しない限りPHPコードは実行されないのでご安心を。
参考URL:http://htmlpurifier.org/
ありがとうございます。
便利なライブラリがたくさん出回っていてびっくりします。
前にも書きましたが、PHPの勉強を兼ねておりますので、自分で考えながら作ってみたいと思います。
No.7
- 回答日時:
ググったらこんなのはありましたね。
function escapeJavascript_r($deep=false){
$search = array ('@<script[^>]*?>.*?</script>@si','@([\r\n])[\s]+@si');
$replace = array ('','');
if ($deep) {
$search[] = '/[\s]+on[\w]{2,15}=[\"|\'][^>]*?[\"|\']/im';
$replace[] = '';
}
return preg_replace($search, $replace, "".$this->v."");
}
再度ご回答ありがとうございます。
残念ながら、複雑すぎて今の私には理解不能です。(^^ゞ
今回は、strip_tagsを使って必要なものだけを許可する、という方針で進めようと思っています。
ありがとうございました。
No.6
- 回答日時:
適当に書いてみましたが動作の保証はありません。
XSSについて理解が漠然としすぎな感もしますし
もしお仕事なら htmlspecialchars 使っとくのが無難な気がします。
function escapeJavaScript($html)
{
$html = preg_replace('/((?:\G|<)[^>]*?)(javascript:)/i', '\\1_\\2', $html);
$html = preg_replace('/((?:\G|<)[^>]*?)([^a-zA-Z])(on[a-zA-Z]+)/i', '\\1\\2_\\3', $html);
$html = preg_replace('/<(script)/i', '<\\1', $html);
return $html;
}
ご回答ありがとうございます。
XSS(クロスサイトスクリプティング)というのですね。(^^ゞ
これをキーワードに探してみれば、よりよい方法がみつかるかもしれません。
ソースまで作っていただきありがとうございました。
ちなみにPHPの勉強をかねて、趣味でやってます。(^^ゞ
No.5
- 回答日時:
お礼の中で、気になる点がいくつかあったので書かせて貰います。
<?php
$hoge = '<?php echo"hogehoge";?>';
echo $hoge;
?>
上のPHPコードを実行すると、どうなるでしょう?
2行目のecho $hoge;はサーバー上で実行されますが、その変数$hogeに格納されている<?php echo"hogehoge";?>は、ただの文字列です。
そのままブラウザに渡されますが、ブラウザ上ではPHPは動作しません。
HTML内にただ<?php echo"hogehoge";?>が残るだけです(表示はされず、コメントとして扱われると思います)。
$hogeに入れる値は、ファイルやDBから取得した場合でも同様です。
通常の掲示板の作り方では、ユーザーがPHPコードらしき文字列を投稿することはできますが、その文字列をPHPコードとして動かすことはできません。
わざわざ、(少々苦心した上で)ユーザーが投稿した文字列をPHPコードとして動作するように作り込みすることは可能です。
可能ですが、わざわざそんなことします?
普通に作れば、ユーザーの投稿した文字列がPHPコードとして動作することはありません。
というのが、No.4の方の最後の2行の意味ですね。
ま、strip_tagsで<?php ~ ?>も削除でしょうけど。
mb_eregiで、大文字小文字を区別しないマッチもできますよ。
http://jp.php.net/manual/ja/function.mb-eregi.php
他には、いくつかHTMLタグを使った嫌がらせを紹介。
開始タグのみを書いて終了タグを書かずに、以降のレイアウトを崩す嫌がらせ。
<font size=100> 大きいサイズを指定してレイアウトを崩す
<font color=#FFFFFF> 背景色と同一の色で書いて、文字を見えなくする
縦横のサイズを大きく指定して、レイアウトを崩す嫌がらせ
<div style="width:1000px;"></div> 幅指定を大きくして、レイアウトを崩す
<p><p><p><p><p><p><p><p><p><p><p><p><p><p><p>たくさん改行することで、無駄に縦に長い空白を作成する。
HTMLタグを許可するって事は、色々なHTMLタグを使った嫌がらせにも対応する必要があるって事で御注意。
ご指摘ありがとうございます。
説明不足&知識不足でうまく伝わらない部分もあると思いますがご容赦ください。
先ほど、投稿フォームから
<?php
$hoge = '<?php echo"hogehoge";?>';
echo $hoge;
?>
を送信したところ、ブラウザには何も表示されませんでした。
ソースを見れば4行のコードがそのまま記述されていますが、ブラウザには表示されません。
このコードが実行されてしまうかもしれないと、私が勘違いをしていたようです。(^^ゞ
PHPやjavascriptなどは、HTML内に埋め込んで動作させることができるので、PHPなどを含むHTMLが投稿された記事を表示させると、PHPなどが実行されてしまう・・・と思っていました。
> 普通に作れば、ユーザーの投稿した文字列がPHPコードとして動作することはありません。
たぶん、普通に作っているはずです・・・。(^^ゞ
後半に記述されたような「消去すれば解決できる嫌がらせ」は気にしていません。
PHPなどが実行され、DBのデータを抜き取られたり、公開ディレクトリより上に置いてある設定ファイルを覗かれたり、といった情報漏洩や、無限ループを仕掛けられてサーバーに高付加をかけるといった、取り返しのつかない事態を避けたいと考えています。
実ファイルに書き込んだコードと、スクリプトで自動生成したコードでは挙動が違うことがわかりました。
私が気にしていた「悪意のあるコード」は実行されないようですね。
ありがとうございました。
No.4
- 回答日時:
入力が予定されるHTMLの内容にもよるかと思います。
日記投稿レベルであればJavaScriptのダイアログなどを利用して
独自のフォーマットで保存してやるとか。
リンク [link=http://domain.dom/]サイト名[/link]
文字色 [color=red]文字[/color]
様々なHTMLが入力されるのであれば、
<script></script>
<* on[a-zA-Z] ..
<a href="javascript: ..
あたりを正規表現なりで除去する必要があります。
もしくは上記のような記述が見受けられれば
「悪意のあるコードが記述されている可能性があります。」
と1回警告を出したのち自己責任で見てもらうとか・・・
> <?php 悪意のあるコード ?>
print などで出力する分には実行されませんが、ファイルを書き出して
phpで走らせたりphpのコードとして評価させるのでしょうか?
ご回答ありがとうございます。
独自フォーマットも考えましたが、今の自分の知識レベルでは難しいので断念しました。(^^ゞ
また、<Script>や<sCrIpT>などと大文字小文字を混在させるパターンや、<script >などと余分なスペースを入れるパターンなど、工夫をすれば無限大の可能性があると思い、現実的ではないような気がします。
最後の二行の意味がわかりませんが、ユーザーがPHPコードを投稿できるということはとんでもないことだと思いました。
一番怖いのは、公開ディレクトリより上の階層に入り込まれたり、DBを覗かれたりする可能性も出てくることです。
説明不足でもうしわけありません。
No.2
- 回答日時:
umotaさんの回答だと、HTMLも禁止されてしまいますね。
strip_tagsという関数があります。
これは、許可するタグ以外をすべて消します。
問題は、許可するタグをすべて列挙する必要があることです。
たとえば、<p>、<strong>、<font>だけを許すのでしたら、
$strippedString = strip_tags($inputString, '<p><strong><font>');
のように書きます。
HTMLのタグもフォームなど危険なものもありますので、記述が面倒かもしれませんが、この方法で許可するものだけを残すことをお勧めします。
ご回答ありがとうございます。
なるほど。便利な関数があるものですね。
下記のようにclassやidを追加したタグはどうなるのでしょうか?
<p class="midashi">
strip_tagsについて調べてテストしてみようと思います。
No.1
- 回答日時:
phpを使っているならば htmlentities 関数で変換する。
例えば "<?php" は "<?php" となるので実行できません。
参考URL:http://jp2.php.net/manual/ja/function.htmlentiti …
ご回答ありがとうございます。
htmlentitiesを通すとHTMLタグも使えなくなるので、残念ながら今回の主旨からはずれてしまうんです・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- PHP ECCUBE4のページ管理でPHPを実行させたい 1 2023/04/06 11:42
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- WordPress(ワードプレス) ワードプレスで、投稿一覧ページにタグを表示する方法 投稿につけたタグを、記事一覧ページにもカテゴリと 1 2023/05/10 21:41
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リンク先を隠す方法はないでし...
-
header("Content-type: applica...
-
iphone/AndloidアプリをPHPで作る
-
PHPで新しいウインドウで開く命...
-
フォントの色を変えるには?
-
PHPのif文でその処理を途中で抜...
-
onedrive にexcelファイルをア...
-
.phpと.incファイルの違いはな...
-
CSV出力にHTMLが入ってしまう
-
バッチを用いたフォルダの自動移動
-
PHPでの複数ファイル出力
-
XML-RPCでsend()できない
-
.htaccessにphp_valueが使用できな
-
文字化けについて
-
VBAでJPGサイズ変更
-
別ファイルの変数を呼び出した...
-
「@$変数」の「@の意味は?」
-
Smarty includeでテンプレート...
-
【file_exists】ファイルが存在...
-
ドラッグアンドドロップで画像...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リンク先を隠す方法はないでし...
-
PHPで新しいウインドウで開く命...
-
csvデータをテーブル表示、指定...
-
PHPでTELNETを実装できる?
-
PHPでつくる更新履歴 作り方と...
-
静的HTMLにRDFを表示させる方法...
-
javascriptで切り替えて、php(...
-
jpgraphで表示されない
-
WordPressのカテゴリページにht...
-
textareaのvalueについて
-
phpプログラムについて
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
PHP8を使うと、大量のWarningが...
-
別ファイルの変数を呼び出した...
-
index.phpって何ですか? 具体...
-
awsにApacheとPHPを入れて、何...
おすすめ情報