• 締切済み

関数htmlspecialcharsと関数sqlite_escape_stringの扱い方

いつもお世話になっております。 環境:PHP5/SQLite3 関数 htmlspecialchars 関数 sqlite_escape_string サイトのセキュリティを考慮し、 上記2関数をなんとなく利用しているのですが、 この「なんとなく」を卒業したいと思っています。 アドバイスして頂きたい内容を書きますと、下記のようになります。 ---------------------------------------- 上記の2関数のうまい使い分けと言いますか、 「こういう時にはこっち!ああいう時には、あっち! んでもって、 これこれこういう時には、どっちも使え!」 ---------------------------------------- というようなアドバイスを期待しております。 DBのクエリ文に使用しないような場合でも、 sqlite_escape_string関数で浄化しておいて損はないように思うのですが、 そういう使い方だと何か問題はありますでしょうか。 (無視できるような小さな問題であれば、気にしないつもりです。) 浄化能力を包含関係で考えると、 htmlspecialchars ⊂ sqlite_escape_string と私は考えていますが、違いますでしょうか。 それと、これらの関数の、 使うタイミングと使う際の注意事項 についても、あれこれお話し頂けると嬉しいです。 具体例(コードorシチュエーション)を示して頂けると助かります。 他にも、こんな関数でも浄化できます、 というようなアドバイスも大歓迎です。 と、とても抽象的な質問文になりましたが、、、 どなたか、「ワンポイントアドバイス」でも結構ですので、 どうか宜しくお願い致します。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

そこまで考えられたら問題ないと思いますよ 一つ付け加えるならhtmlspecialchars は不可逆変換なので変換したら元には戻せません("<<"も"<&lt;"も同じ結果になるので多対1の変換になります) 自分の場合はこういう不可逆変換は処理が必要になる直前に行うようにしています(いつ仕様が変わって元データが必要になっても困らないように)

march4
質問者

お礼

htmlspecialchars()は処理後、 "<<"も"<&lt;"も同じ結果になる多対1の不可逆変換なので変換したら元には戻せない というアドバイス、ありがとうございます。 私にはない視点でしたので大変参考になりました。 >自分の場合はこういう不可逆変換は処理が必要になる直前に行うようにしています こちらもスクリプト設計の参考にさせて頂きます。^^

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

全く目的の違う関数で、包含関係にはありません。 マニュアルを熟読するのがよいでしょう。 http://jp.php.net/manual/ja/function.sqlite-escape-string.php http://jp.php.net/manual/ja/function.htmlspecialchars.php

march4
質問者

お礼

アドバイスありがとうございます。 早速、マニュアルを再度読んできました。 ご指摘の通り、確かに両関数は包含関係にはなさそうですね。 htmlとして処理・表示させる際に、 htmlタグとしてではなく、その記号本来の形で出力したい場合には、 htmlspecialchars()で変換してやる必要があるわけですね。 一方、 sqlite_escape_string()は、 sqliteにおけるSQL文の中で問題を起こしそうな記号やら書式に対し、 適切にエスケープを行ってくれる関数のようですね。 両関数とも、正常な処理または表示をするという目的のために、 問題を起こす可能性のある記号に対し、変換処理を行う という意味では共通しているなと感じました。 ただ、両者では、目的が異なるため、変換のしかたが異なるようですね。 例えば、シングルクオート「'」への処理において見てみると、 それぞれ、 htmlspecialchars()では、 ''' (シングルクオート) は '''に、 sqlite_escape_string()では、2重にされてエスケープ、 されるようですね(設定によっては、異なる場合もありますが)。 よって、 例えば、GETか何かで値(文字列)を受け取り、 それをSQLデータベースへいったん入れ、さらに、それを取り出して、HTML出力する、なんて場合には、 両関数どちらも使うことになりそうですね。 なんだか、モヤモヤが晴れてきました。 上記のようなシチュエーションにおける、 処理の方法としては、 htmlspecialchars()→eslite_escape_string()→DB処理→HTML出力 というフローの他に、 eslite_escape_string()→DB処理→htmlspecialchars()→HTML出力 というフローも考えられますが、これらは 目的によって、使い分けられるものだと思います。 ただ、どちらでも問題ないという場合には、 どちらの方が、よりメリットがありそうでしょうか。 前者だと、DBにインサートするデータ量が若干増えますが、 呼び出しの際に毎回htmlspecialchars()処理をする必要がないので処理が比較的速そうです。 一方、後者はその逆となりそうです。 (大差ないかもしれませんが。苦笑) ひとまず、こんなことを考えました。 上記を踏まえた上で、 何か「忠告しておきたいこと」などがありましたら、 どなたか、どうかご教授下さい。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう