
PHP, HTML, MySQLと一部javascriptで添削システムを作っています。
以下のようなページを作りました。
http://flab.aid.design.kyushu-u.ac.jp/~harano/pr …
HTMLタグをつけたままデータベースに保存 しています。
ですが、このままだと入力する人が勝手にHTMLタグやjavascriptのソースなどを書けてしまいます。
javascriptはあまり詳しくありませんが、データを消すようなソースを入力されてしまっては機能しません。
何かいい改善案があればどんな情報でもいいので教えてください。
No.1ベストアンサー
- 回答日時:
一般的にいう、SQLインジェクションとクロスサイトスクリプティング(XSS)を行えてしまう状態ですね
この二つの問題は分けて考えなくては混乱するだけですので整理します
HTMLのタグやJavaScriptが悪さをする瞬間というのは、ブラウザに出力するタイミングです
ですからデータ入力時やデータベースに保存する場合には、HTMLやJavaScriptは何にも悪さはしません、単なる文字列としてデータベースに保存されますので、データベース保存時や選択時にHTMLタグやJavaScriptに対しては気にすることはありません。
しかし、入力欄にSQLインジェクションされるとデータ保存時や選択時に誤った処理をしてしまいますのでSQLインジェクションに対してはSQL文を生成する瞬間に対策をしなくてはなりません
入力欄
↓
validate(文字数や、数値のみ入力させたい場合、半角英数のみの場合などの検査をする)
↓
DBにINSERT/UPDATE *SQL文を生成時にSQLインジェクション対策のエスケープをする
↓
DBからSELECT *SELECT文を生成する場合にもSQLインジェクション対策用のエスケープをする
↓
取得されたデータを何かしら処理する
↓
HTMLとして出力する *この時にXSS用のエスケープをして出力をする
ざっとこんな感じかな
つまり
XSSとSQLインジェクションとでは対策をする方法や場所が違うということです。
SQLインジェクションはSQL文を生成(SQL文として出力)するタイミングで、XSSはHTMLとしてブラウザに対して出力をするタイミングで ということになります
さまざまなセキュリティ対策が必要ですが、どんな対策に対しても「入力は甘く、出力がギチギチに絞める」が鉄則だと私は思います。
入力されてくるデータは何が入ってくるのか分からないのでとりあえず受け取る。
出力するデータは、こちらの思うがままにギチギチに締め付けてやれば良い。
ということです。
SQLインジェクションですか。
XSSは他の人から教えてもらったのですが、そちらの方までとは知りませんでした。
早速、今から調べながらとりかかろうと思います。
inu2さんの回答を読んだだけで勉強になります。
分かりやすい説明をしていただきありがとうございました。
No.2
- 回答日時:
No.1の方の補足となりますが。
//毎回思うがinu2さんの文は秀逸だと思うんだ・・・
具体的には
htmlspecialchar()
http://jp.php.net/manual/ja/function.htmlspecial …
mysql_real_escape_string()
http://jp.php.net/manual/ja/function.mysql-real- …
pg_escape_string()
http://jp.php.net/manual/ja/function.pg-escape-s …
is_numeric()
http://jp.php.net/manual/ja/function.is-numeric. …
strlen()
http://jp2.php.net/manual/ja/function.strlen.php
この辺の使い方、使い時をマスターすると良いです。
他の識者はもっといろいろ知ってるかもしれません。
そのほかにも活用できる関数はありますが、その辺は工夫と努力、それとセキュリティに関する情報のアンテナを常に意識しつつ勉強すると良いです。
URLから察するに大学の課題の一環かなと思いますが、
TAなどの人の方が専門的知識豊富でしょうからそちらに当たってみるのも良いかもしれません。
バリデートって何、クロスサイトスクリプティングって何と聞けば嬉々として具体的なことを教えてくれることでしょう。
// TAの人が現場を知っててコアな人だと
// デザインパターンやオブジェクト指向まで波及した話を
// してくれるかもしれませんね。
勉強するポイントまでご親切に教えてくださって本当にありがとうございます。
これは学校の課題のようなものです。
教授に「ここの部分のセキュリティが甘い」と言われた部分でした。
頑張ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
処理を止める関数
-
¥マークを出力したいがバック...
-
CSV出力にHTMLが入ってしまう
-
PHPSpreadsheetによる書き出し...
-
phpのheader("Location:#pos")...
-
PHPのif文でその処理を途中で抜...
-
.htaccessにphp_valueが使用できな
-
mysql→EUC-JP、php→UTF-8の時の...
-
2つの画像ファイルが異なるファ...
-
require_once()でファイルが読...
-
phpの中でphpを書けないか
-
FTPコマンドでディレクトリごと...
-
MkDir関数
-
【file_exists】ファイルが存在...
-
sqlで日付が一番古いデータの月...
-
フォームで戻った際に入力済み...
-
<A href ~ と一緒に値を渡すには
-
テレメールとは?
-
「クラス関数」「メンバ関数」...
-
Makefile.inとMakefile.am
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ob_end_clean と ob_clean の違...
-
CSV出力にHTMLが入ってしまう
-
GDで生成したはずの画像が文字...
-
Wordpress、カスタム投稿の管理...
-
mPDFでのPDF出力がうまくいかな...
-
phpにcssを適応させたい...
-
PHPで`headers already sent`と...
-
PHP/phpMyAdmin/データベースな...
-
TCPDFについて
-
PHPで取得したHTML内のdiv要素...
-
リダイレクト元のURLの取得方法...
-
ImageStringで日本語表示させたい
-
PHPにおける時間計算、時間足し...
-
PHPで五角形、または多角形のグ...
-
JavaScriptからPHP呼び出しHTML...
-
warningを画面に表示させない設...
-
CGIからPHPへの書き換え
-
FeedPHPでfeedをHTML表示を11個...
-
【smarty】<A href="">内でのみ...
-
PHPをSJISでやるのは不可能
おすすめ情報