• 締切済み

文字の無害化のタイミング

PHPにて、ユーザの入力情報を保管し、サイト内で表示利用するシステムの入力に対する文字列の無害化に関しまして、 今まではユーザの入力→htmlspecialchars→データベース取込 という流れで行っておりました。 最近、他のことを調べていると、 ユーザの入力→データベース取込→表示の際にhtmlspecialcharsする という記事を見かけました。 どちらの方がより、無害化の効果がありますでしょうか。 後キュよろしくお願いいたします。

  • toema
  • お礼率60% (43/71)
  • PHP
  • 回答数3
  • ありがとう数0

みんなの回答

noname#244856
noname#244856
回答No.3
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

「必要なときに必要な処理」を行うのが基本です。データベースに格納するときは「データベースに格納するためのエスケープ処理」だけを行います。 htmlspecialcharsを重複して実行してしまっても困りますし(htmlspecialcharsしているハズと思って)処理漏れがあってもダメですから「htmlとして表示するときに」無害化するのが確実で間違いありません。 同じ内容をなメールの本文(text/plain)に展開するときは、htmlspecialcharsせずに記載しますからね。

noname#247307
noname#247307
回答No.1

> ユーザの入力→htmlspecialchars→データベース取込 > ユーザの入力→データベース取込→表示の際にhtmlspecialcharsする この両者であれば、後者の「表示の際にhtmlspecialcharsする」が正しいと思います。 そもそも、「無害化」という発想そのものが奇妙であると思います。「HTMLは、タグとして記述される場合以外は<>&などといった特殊記号はエスケープして書くように設計されている」というだけのことですので、どんな場合でもHTML記述時に記号をエスケープするのが基本でしょう。それはデータベースの保存うんぬんは関係なく、手書きでHTMLのコードを書くような場合から常に一貫して考えるべきものなのですから。 また、「データは可能な限りオリジナルの状態を保持する」のがデータ処理の基本であると思います。加工したデータは、もう元には戻せません。こうした点からいっても、「加工済みのデータを保管する」というのは違和感を覚えます。 更には、「データベース保管時に考えるべきは、サニタイズではなく、SQLインジェクション対策である」という点も忘れてはいけません。必要なときに必要な対策をまず考えるべきで、データベース保管時にSQLインジェクション対策の他に(別に後でやってもかまわない)サニタイズまでまとめて処理する、というのはどうなのだろう、という気がします。自分はわかっても、例えば他人に引き継いだりしたとき混乱したり勘違いしたりしないか、という不安があります。 いろいろ考えると、データベースへの保管時は、SQLインジェクション対策のみをしっかりと考え、HTMLを出力するときには、(それがデータベースから取り出したものかどうかは関係なく、すべてのところで常に)htmlspecialchars処理したコードを書く、と考えるのがいいのではないかと思います。

関連するQ&A

  • 文字によって文字コードが違ってしまいます。

    PHP4.3.9で、テキストボックスにひらがなを入力してもらい、 その文字列を元にSQL文を発行して結果を表示するシステムを構築しております。 (JavaScriptを用いて簡易キーボードを作成し、ひらがなしか入力できないようにしてあります。) ユーザに入力してもらった、ひらがなをPHPで受け取った際、 特定の文字ではUTF-8として扱いSQL文が発行されるのですが、 別の文字ではASCIIとして認識してしまいます。 全てのひらがなをUTF-8として扱わせるにはどのような設定が必要なのでしょうか? ちなみに、.php、.inc、.jsは全てUNICODEで作成しております。

    • 締切済み
    • PHP
  • IDの払い出し(文字列)

    WEB APでデータベースを勉強中のものです. ユーザを管理するID番号をデータベースの連番IDではなく,文字列のIDにしたいのですが,どうすればいいでしょうか.PHP等で作成する方法でもいいです. 文字列IDにすると特定されにくいかなって思っています. 例えば A100001 C100002 です.

  • データベースに登録してあるパスワードを画面に表示

    データベース(MYSQL)に登録してあるパスワードを暗号化(ハッシュ化)して保存してあります。 それをPHPに表示させる際どのようにもとのパスワードに戻して表示させるかがわかりません。 もとのパスワード abcd とする。 ハッシュ化したものを仮に123456789とする。 データベース上では123456789となっているが PHP上ではabcdとパスワードを表示させる方法がわかりません。 やりたいのは、 PHPのシステムにログインしている状態で別のシステムにリンクで飛んだ際、 「ユーザ」「パスワード(abcd)」で自動ログインさせたいのです。 ※ユーザは暗号化していないので「ユーザ」データを引き継いでいく事ができるのですが パスワードが暗号化されている為、どのように表示させたら良いのかが分からないのです。 <a target="_blank" href="http://192.***.**.****/●●●/portal/?action=ALJLoginUser&username=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['username']); ?>&password=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['password']); ?>" > 上記ですと]['username']は表示できますが['password']は空になってしまいます。 どのようにしたら良いのでしょうか? どうぞ宜しくお願い致します。

  • マルチバイト文字の大文字、小文字を区別せずに置換

    ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。 フォームから入力された文字列が[php]として、 php、PHP、Php、phP、php、PHP、Php…など、全角、半角、大文字、小文字関係なく色を変えたい場合、 半角の文字列はeregi_replace()でできると思うのですが、全角の場合はどのように記述すれば良いのでしょうか。 フォームから入力された文字列を全角に変換してmb_eregi_replace()を行ってみたのですが、うまくいきませんでした。 文章を半角に変換すればできるとは思いますが、出来る限りそれはしたくありません。 特に一つの関数で…という事は考えていません。 何か良い方法がありましたらアドバイスをお願い致します。

    • ベストアンサー
    • PHP
  • エクセルでの文字変換

    エクセルで入力の際  普通に (1)と入力しEnterを押すと -1 と表示されます。 ユーザー設定から文字列にすると 入力の通り (1) と表示されます。 わざわざ文字列にしなくても入力通りに (1)と表示する方法はありませんか。

  • パスワードのsaltの構築方法

    PHPでパスワードの登録でsaltを使用しようと考えているのですが、ネットで調べても自分の疑問に思っている事が出てきません。 パスワードにsaltという十分な長さ(40文字とか)の文字列を加え、それをmd5などでハッシュ化する・・・と言うことは分かりました。 しかしその実装方法が分かりません。 A.saltはランダム乱数でもいいし、セキュリティは低くなるが固定文字列でもいい。 B.saltは別ファイルに保管(一緒に保管と書いてあるのもありましたが)する。 、というような記事を見かけました。 で、自分はZendFrameworkのマニュアルに沿って考えたのですが、 データベーステーブルにpassword、saltカラムを作成する。 登録時、$_POST['ユーザの入力値']を(ハッシュ化する)passwordカラムに、saltはここでは単純にmt_rand(0,99)としてsaltカラムに登録、とした場合に認証時にはどのようにすればいいのでしょうか? 認証時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものと、データベースに格納されているパスワードと同じく格納されたsaltを結合しそれをmd5()したものを比べる ・・・となるとパスワードさえ合って入ればいいので別にsaltは不要なような気がするのでこの実装法は間違っているのかなと思います。 そうではなく、登録時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものをpasswordカラム又はsaltカラムに格納する・・・というのも正しいのかな?と思います。 データベースに侵入されればどちらもダメなので、何か別ファイルに保管するのかなとも思いましたが良く分かりません。 登録フォーム => ログインフォームにおいてのsaltの実装法を教えていただけないでしょうか?少し頭がぐちゃぐちゃになり、ちょっと文章がおかしい気もしますがすみません。

    • ベストアンサー
    • PHP
  • PHPソースファイルの文字列置換をしてから、

    PHPソースファイルの文字列置換をしてから、 そのスクリプトを実行する方法を実行しようとしている のですが、うまくいきません。 似たような質問(http://oshiete.nikkeibp.co.jp/qa5496696.html) を参考にして、文字列置換自体はうまくいったのですが、 phpファイル実行時にまったく関係の無いはずの DBアクセスでエラーが発生してしまいました。 変換前前のphpファイルに置換後の文字列を手で入れて、 データベース実行するとうまくいきます。 しかしながら、phpファイルの文字列置換をstr_replaceで実行し、別名保存した後 includeしても、うまくいかないといった状況です。 ちなみに置換後のphpファイル内で $置換後文字列 = "test"; echo $置換前文字列; とすると、置換前文字列が置換後文字列に きちんと変わっているようで、 "test"と出力されます。 もしかすると、原因は違う所に潜んでいるのかもしれませんが、 どこを調べれば良いのか検討がつかず困っております。 どなたか解決手段の分かる方がいらっしゃれば教えて頂けませんでしょうか? -------------------------------------------------------------- 尚、ファイル構成は top |-change (1.php) |-database (2.php) |-search (検索画面[データベース検索の入り口。form action ="./3.php"],3.php) |-base (4.php,5.php[tempファイル]) となっており、 それぞれの中身は 1.文字列置換実行用のphpファイル(1.php):  1-1.file_get_contentsで4のphpファイルを取得  1-2.str_replaceを用いて文字列置換  1-3.文字列置換したファイルをfwriteで4.phpと同じディレクトリに保存(5.php)  1-4.5.phpをincludeする。  1-5.5.phpをunlinkする。 2.データベースアクセス(mysql)用関数を含むphpファイル(2.php):  ↓エラーの原因と思われる関数  function connect() { global $host,$user_id,$passwd,$con; $con = mysql_connect($host,$user_id,$passwd); } 置換前phpファイルを手動で文字列置換した場合には  同ファイル内で設定したglobal変数の値がきちんと格納されており、  データベース実行がうまくいきます。  置換後phpファイルでは$host等に値が格納されていないため、  データベース実行がうまくいきません。  グローバル変数の中身は同ファイル内で定義しています。 3.検索を実行した時に呼び出されるphpファイル(3.php):  3-1.include("../change/1.php"); 3-2.1.phpの関数の実行 4.文字列置換前のphpファイル(4.php): /*呼び出し元のディレクトリ位置でないとincludeに失敗する*/ 4-1.include("../database/2.php");  4-2.2.phpのデータベースアクセス関数を実行する。 5.文字列置換後のphpファイル(5.php): 3-2の1.php関数の実行により、一時的に生成される。

    • ベストアンサー
    • PHP
  • 文字列中に一部存在する文字化けの除去

    ネット上のデータベースを取得してphpで変換し、htmlにjavascriptを通して表示させるようなものを作っているのですが、稀にそのデータベースに文字化けした文字列が混ざっている場合があり、そうなるとjavascriptで書き出すときにエラーが起きて処理が止まってしまいます。 何か文字化けを発見して除去するなど、動作に支障がでない方法があればどなたかご教授ください。

    • 締切済み
    • PHP
  • ASP.NET(VB2005)■ WEBページのテキストボックスへ入力するとき、文字列を2桁入力するごとにハイフンを表示させたい

    ユーザーがWEBページのテキストボックスへ入力するとき、 文字列を2桁入力するごとにハイフンを表示させ、その状態を維持したまま 次に文字列を入力させることは可能でしょうか? 例. 1.ユーザーが「01」と入力 2.ハイフンが表示され、テキストボックスの表示は「01-」となる 3.続けてユーザーが「02」と入力 4.ハイフンが表示され、テキストボックスの表示は「01-02-」となる この流れで「01-02-AB-CD-E5-F5」とテキストボックスに表示される結果にしたいのです。 その後、テキストボックス文字列をデータベースに取得させます。 (因みに上記英数字はあくまでも例です) 開発環境は以下です。  ・WinXP SP2  ・Microsoft Visual Studio 2005(VB2005)  ・ブラウザはIE6のみを前提としています。   いつも質問ばかりで申し訳ございませんが、 もしご存知の方がいらっしゃいましたらどうぞご教授をお願いします。 ヒントになるようなことや参考になるWEBサイトでもアドバイス頂けると嬉しいです。 現場開発経験約3ヶ月ほどなのでわかりやすく説明下さるとなお有難いです。<(_ _)>

  • このようなユーザー定義の文字列の設定

    たとえば「20210411」と入力(またはコピペ)すると、「2021年04月11日」と表示してくれるような、書式におけるユーザー定義の文字列について教えてください。 もうひとつなのですが、同様に、 たとえば「-100」という文字列を入力(またはコピペ)すると、マイナスの部分がとれて「100」表示してくれるような、書式におけるユーザー定義の文字列について教えてください。 Excel2019利用です。

専門家に質問してみよう