• ベストアンサー

htmlタグを含んだ文字のデータベースへの読み書き

PHPで、「htmlタグを含んだ文字」を、 データベースへ読み書きする安全な方法を教えて下さい。 リンクタグや、フォントタグなどは、 そのまま使用できるようにしたいです。 ■追加する時 htmlフォームからデータベースに保存(SQLインジェクション) ■編集する時 データベースからデータを読み出す(htmlエスケープ) htmlフォームで再編集し、データベースに保存(SQLインジェクション) こういう作業になるかと思いますが、 どのように処理したら、htmlタグを使いつつ、 安全に更新ができるでしょうか? 教えてくださいm(_ _)m

  • k5z
  • お礼率34% (9/26)
  • MySQL
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>■内容を再編集する時、htmlタグを無効化しつつ、再編集する方法 PHPで編集するというからにはhtml画面上で処理をすると考えてよいですね? であればtextareaにhtmlspeacialcharsで処理した文字列を入れて 編集させるのが一般的でしょう。 >■データベース登録時、プリペアドステートメントで、\(円マーク)がついてしまう事の対処方法 SJISの5C問題あたりを気にしているのでしょうか? もし万が一DBのキャラクターセットをSJIS系にしようと考えているなら やめた方がいいでしょう。 UTF8なり適切な文字コードを利用して、入出力の際に文字コードの コンバートをかけることで問題は最小化することができます。 また見た目上エスケープした文字が登録されても、PHPで抽出して出力するときには アンエスケープされた状態で取り出せるとおもいます

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

普通にプリペアドステートメントで処理すればよいのでは?

k5z
質問者

補足

投稿、有難う御座います。 ■内容を再編集する時、htmlタグを無効化しつつ、再編集する方法 ■データベース登録時、プリペアドステートメントで、\(円マーク)がついてしまう事の対処方法 この辺りをお聞きしたかったのです。

関連するQ&A

  • 文字コードエスケープ処理について

    現在MYSQLとPHPを使ってデータベースを構築してます。 XSSやSQLインジェクションはフォームなどに悪意のユーザがJavascriptのコードを入力するんですよね? ちょっとテストで検索フォームに Javascriptコード を入力してみたんですが何も起こりませんでした。これは処理がされていると思って良いんでしょうか?URLは画像のようになりました。

    • 締切済み
    • PHP
  • 管理画面の入力フォームをhtml編集可能にする場合

    PHP+MySQLを使っています。 管理画面から入力した商品情報のデータをDBに保存し、DBから情報を取得してホームページに反映させたいと思っています。 その管理画面の入力フォームで、商品詳細を記述する入力ボックスをhtml編集できるようにする場合(タグをつけて記述できるようにする場合)、クロスサイトスクリプティングやSQLインジェクションなどの攻撃の対策としてどういった手法がありますか。 html編集できない入力ボックスを作るときは、私は、タグを取り除くなどの処理をしてDBに保存しています。タグをつけたままDBへ保存するというのはセキュリティとしてはよくないのではと思う部分があり、みなさんはどうされているのかと思い、質問させていただきました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • C言語でアクセスデータベースのメモ型の読み書きをしたい。

    データベース初心者です。C言語(C++)でアクセスデータベースの読み書きをしていますが、メモ型の読み書き方法が判りません。アドバイスをお願いします。 アクセス方法は、ODBC-APIを使用して <書き込み時> SQLPrepare SQLBindParameter SQLExecute <読み込み時> SQLExecDirect SQLBindCol SQLFetch の手順で行っています。 教えて欲しい内容 1.メモ型の場合、BIND時のフィールド形式指定は、何を使用するのでしょうか? 2.フィールド指定をSQL_C_CHARとして、書き込みを行うと1000文字以上に書き込むこと出来ているようですが、読み込み時に失敗します。アドバイスをお願いします。

  • htmlタグがあるデータのエスケープ処理

    今 phpを勉強していて自分の勉強用にブログを作ろうと思っています。 ですが、その事で分からないことがあり、質問させていただきます。 それは、データベース内にある記事データのエスケープ処理についてです。 記事データを日付順やカテゴリーごとに並べて出力する際にエスケープ処理をすると htmlタグがもちろんそのまま出力されてしまいます。 自分が参考にした本では出力するデータは全てエスケープするべきだと書かれていましたが、 今回のようなケースはどうすればいいのでしょうか? 1, ユーザー入力ではなく、運営者のみが入力するデータの場合、エスケープは必要ないのでしょうか?   その場合セキュリティの問題はないのでしょうか? 2, それとも全ての場合においてエスケープ処理は必要で、htmlタグを含んだデータを   データベースに入れるのが問題なんでしょうか? どなたか回答お願いします。

    • ベストアンサー
    • PHP
  • CGIのtextareaへのタグの表示

    CGI(Perl)でWebのメモ帳のようなプログラムを作っています。 何種類かのHTMLタグの使用もできるようにしてあり、更に タグ説明のために &lt; &gt; などを記入することもあります。 初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を 編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と &lt; &gt;が どちらも <>に変換されてしまい、説明中の HTMLタグ文字列がタグになってしまいます。 例えば A: 最初の記入時「&lt; a href・・・ &gt; はリンクタグ」などと記入してアップロード B: サーバーログには「&lt; a href・・・ &gt; はリンクタグ」のまま記録される C: 編集のためにその記事を再表示させるとブラウザが「<a href・・・ >はリンクタグ」 と表示する D: 別の部分を編集後再アップロードするとログには <a href・・・ > がタグとして記録される E: 以降の表示では <a href・・・ > の部分がリンクタグとして扱われ「はリンクタグ」にリンクがかかる というような問題に悩んでいます。 textarea 内では <code>タグも使えなさそうで・・・ 思案の末、 textarea への送信時だけ 「 &lt; 」を 「<<」などとして送信し、CGIが「<<」を受け取ったら &lt; に変換してログ記録する などのローカルな方法を考えましたが、あまりスマートではないかと。 定石のような方法はないのでしょうか?

    • ベストアンサー
    • CGI
  • Unix(AIX)サーバーで、ASPコードを使用してのMS Accessのデータベースを読み書きなどするのは可能でしょうか?

    MS Accessのデータベースを使用して、ASPコードでそのデータを読み書き編集したりできるようなオンライン・アプリケーションのページを作成したのですが、サーバーがUnix(AIX)だと作成終了時に知りました。 Unix(AIX)上でASPコードを使用してのMS Accessのデータベースを読み書き出来る方法をどなたか知っている方いましたら教えてください。

  • データベースに"や'を保存できない

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 自己紹介文のような長めの文章をデータベースのTEXT型カラムにUPDATEで保存したいです。 $stmt = $db->prepare("UPDATE member SET text=:text WHERE id=:id"); $stmt -> bindParam(':text ',$text,PDO::PARAM_STR); $stmt -> bindParam(':id',$id,PDO::PARAM_INT); $stmt -> execute(); というSQL文を作成し、 文字列データを保存することはできたのですが、 「"」や「'」のような記号を含めるとそれ以降の文章が消えた状態で保存されてしまいます。 例えば顔文字などで「"」や「'」のような記号を使用する場合もあると思うので、 できれば、データベースに保存したいです。 どうしたら安全に「"」や「'」が保存できるでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのデータベースへの接続

    1.PHPでフォームデータを受け取る 2.データベースに接続をして書き込み 3.書き込まれたIDを取り出す + 数値 + 乱数を一つの文字列に結合 4.上記の文字列をデータベースに保存。 このような動作は一つのphpで可能でしょうか? 2.までの動作は問題ないのですが、 3.からが動作しません。 どなたかご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPからデータベースへの登録について

    はじめまして。現在、仕事の関係でPHPのプログラムを勉強している者です。 早速ですが、質問させていただきます。 PHPで作成したフォームメールから別で用意したデータベースに 入力データを登録しようとしているのですが、エラーでうまく動作しません。 PHP側のコードミスもあるかもしれませんが、PHPを動作させているサーバーと データベースサーバーの文字コードが違う点も原因しているのでは?と調べている状況です。 フォームからのデータを送るPHP ⇒ Shift_jis PHPをアップしているWebサーバー ⇒ Shift_jis データベースサーバー ⇒ EUC-JP データベースへの接続は問題なく行えているようですので、 登録処理するコードの部分のみを書きます。(↓) ******************************************************************************** // データベースへの登録 $sql = "INSERT INTO FORM_DATA(DataNumber, Time, Name, Email, Area, Sex, Interest, Commnet, OS, IP) VALUES('$tsvcount', '$ymdhis', '$sender_name', '$mail_address', '$mail_area', '$mail_sex', '$mail_interest', '$mail_body', '$os', '$ip')"; $sql = mb_convert_encoding($sql, 'EUC-JP', 'sjis'); mysql_query("SET NAMES 'EUC-JP'"); $db_result = mysql_query($sql); print $sql; print $db_result; if (!$db_result) { exit('Error! データを登録できませんでした。'); } // データベースとの接続解除 $db = mysql_close($db); if (!$db) { exit('データベースとの接続を閉じれませんでした。'); } **************************************************************************** PHP&Webサーバーとデータベースの文字コードを統一すればいい話かもしれませんが、 事情により異なる文字コードの環境で開発しております。 上記の通り、データベースに送信するSQL文はmb_convert_encoding()で「EUC-JP」に変換し、 mysql_query($sql);でデータベースに送信している形です。 この状態で送信すると、エラーとなり送ったSQL文を処理してくれません。 文字コードの変換処理、コードの記述など何が原因なのか分からず困っています。 考えられる原因と、解決策があればご教授いただきたいです。 ちなみに私はPHPはもちろんプログラム自体もまだ経験が浅く、 基礎的なことも理解していないことがかなりあります。 その上でご説明いただけますと大変有難いです。 ではよろしくお願い致します。

    • 締切済み
    • PHP
  • PHP、Postgreのおすすめサイト

    前任者の退職で、急遽イントラネットデータベースの構築を引き継がなくてはならなくなりました。 概要は、NTで走っているApacheと連動したPHP、Postgreでデータの追加、問い合わせ、データの加工・テキスト出力といった物で、フォーム設計なども含みます。 私自身は一応Accessは使えますので、SQLとか正規化とかリレーションとかHTMLのタグの編集とかは理解できます。 こういった前提で、PHP、Postgreのおすすめサイトとかサンプルソース集のような物がありましたら、ご教授願います。 検索したり書籍をあたったりはしてみましたが、種類が多すぎて、これだ、というのを見つけられませんでした。