Webデザイナが知っておくべきPHPセキュリティ
たにぐちまこと(H2O Space.)
2008/04/10 08:00
- 8件のコメント
#1 大野晋一
- 2008/04/10 14:18:17
htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES, 'EUCJP')
#2 h2ospace
- 2008/04/10 18:56:57
筆者です。「htmlspecialchars」の件、うっかりしていて大変失礼いたしました。
はてなブックマークやトラックバック等でご指摘いただいた方々、誠にありがとうございました!
» 不適切なコメントを報告する
はてなブックマークやトラックバック等でご指摘いただいた方々、誠にありがとうございました!
#3 がる
- 2008/04/19 01:46:29
本文中に出ている
mysql_query("SELECT * FROM login_table WHERE id=".mysql_real_escape_string($_REQUEST['id'])." AND password=".mysql_real_escape_string($_REQUEST['password'])");
ですが。
最後のダブルクォートが不要である(というかこのままだとシンタックスエラー)であることを除いてもなお、問題があります。
というかこのままではSQL-Injectionの脆弱性は全然とれておりません。
セキュリティの記事であれば、きちんと検証なりされるか、或いは相応の識者に確認などを取られてから記事を書かれる事を強くお勧めいたします。
といいますか。
先日のC++といい。中身のレビューが全く出来てないと思うのですが。そのあたり、編集の方はどのようにお感じになられているのでしょうか?
» 不適切なコメントを報告する
mysql_query("SELECT * FROM login_table WHERE id=".mysql_real_escape_string($_REQUEST['id'])." AND password=".mysql_real_escape_string($_REQUEST['password'])");
ですが。
最後のダブルクォートが不要である(というかこのままだとシンタックスエラー)であることを除いてもなお、問題があります。
というかこのままではSQL-Injectionの脆弱性は全然とれておりません。
セキュリティの記事であれば、きちんと検証なりされるか、或いは相応の識者に確認などを取られてから記事を書かれる事を強くお勧めいたします。
といいますか。
先日のC++といい。中身のレビューが全く出来てないと思うのですが。そのあたり、編集の方はどのようにお感じになられているのでしょうか?
#4 大野晋一
- 2008/04/21 20:39:44
builder編集部の大野です。
シンタックスエラーの件は大変失礼いたしました。誤って余計な記号が含まれてしまいましたので、修正いたします。
また、ご指摘のセキュリティ面の脆弱性についてですが、以下の資料を参考にさせていただいております。
情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方
http://www.ipa.go.jp/security/vuln/websecurity.html
PHP: SQLインジェクション - Manual
http://jp.php.net/manual/ja/security.database.sql-injection.php
もちろん、実際にはmysql_real_escape_string()のほかにも、addslashes()や文字コードへの対策などもするべきかと思います。しかし、本企画の「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識を、PHPを例に4回にわたって紹介」するという主旨をご理解頂ければ幸いです。
http://builder.japan.zdnet.com/sp/php-for-desinger-2008/story/0,3800085347,20369782,00.htm
ほかの問題がございましたらご指摘いただければ幸いです。
ご指摘の通りのチェック体制の至らなさは見直して参ります。それでは、今後ともどうかよろしくお願いします。
» 不適切なコメントを報告する
シンタックスエラーの件は大変失礼いたしました。誤って余計な記号が含まれてしまいましたので、修正いたします。
また、ご指摘のセキュリティ面の脆弱性についてですが、以下の資料を参考にさせていただいております。
情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方
http://www.ipa.go.jp/security/vuln/websecurity.html
PHP: SQLインジェクション - Manual
http://jp.php.net/manual/ja/security.database.sql-injection.php
もちろん、実際にはmysql_real_escape_string()のほかにも、addslashes()や文字コードへの対策などもするべきかと思います。しかし、本企画の「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識を、PHPを例に4回にわたって紹介」するという主旨をご理解頂ければ幸いです。
http://builder.japan.zdnet.com/sp/php-for-desinger-2008/story/0,3800085347,20369782,00.htm
ほかの問題がございましたらご指摘いただければ幸いです。
ご指摘の通りのチェック体制の至らなさは見直して参ります。それでは、今後ともどうかよろしくお願いします。
#5 がる
- 2008/04/22 06:11:44
がるです。
大変に手厳しい発言になり恐縮ではあるのですが。
> また、ご指摘のセキュリティ面の脆弱性についてですが、以下の資料を参考にさせていただいております。
「参考にした資料があるから問題はない」とでもおっしゃりたいのでしょうか?
一応念のために、ごく簡単にミニマムコードを書いて「実際にクラックが可能であることを確認してから」コメントを差し上げているのですが。
逆に。御社側で多少なり、そういったチェックは本当に行われているのでしょうか?
筆者様にそのような確認はちゃんととられているのでしょうか?
> もちろん、実際にはmysql_real_escape_string()のほかにも、addslashes()や文字コードへの対策などもするべきかと思います。しかし、本企画の「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識を、PHPを例に4回にわたって紹介」するという主旨をご理解頂ければ幸いです。
そういう問題ではありません。
もっと、きわめて基本的な部分で欠落がございます。
こんな生半可で半可通な知識は、まさに「生兵法は怪我の元」なだけ。こんなレベルなら、ない方がマシです。
> ほかの問題がございましたらご指摘いただければ幸いです。
ほかの問題ではなくて。前回コメントで指摘させていただいた内容が、以前の、C++の記事の初めの修正と同様「問題の本質を理解しておらず」「故に修正箇所などが全く的を射ていない」のです。
…と書き立てても御理解いただけないでしょうから、正解を書いておきます。
mysql_query("SELECT * FROM login_table WHERE id='".mysql_real_escape_string($_REQUEST['id'])."' AND password='".mysql_real_escape_string($_REQUEST['password']) . "';");
ポイントはWHERE句において文字列をシングルクォートで囲っているかいないか、です。
試しに。筆者や大野様が「問題ない」とおっしゃっている、元のソースコードで。
IDに“hoge OR (1=1”、passwordに“1) OR 1=1”という文字列を入れてみてください。
SELECT * FROM login_table WHERE id=hoge OR (1=1 AND password=1) OR 1=1;
ちなみに、修正したソースの場合、以下の通りになります。
SELECT * FROM login_table WHERE id='hoge OR (1=1' AND password='1) OR 1=1';
こんなSQLが通るものが、本当にセキュアなのですか?
これが「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識」なのですか?
「まずい」と指摘された場合に。「すでにミスを起こしてしまっている社内リソースで全てを片付ける」のではなくて、まず初めに「どこがまずいのか」を指摘者に質問するくらいの余裕があってもよろしいのではないでしょうか?
拝見しているかぎりでは。指摘を受けた後も結局は「知識的に足りない社内リソースだけで物事を片付けようとし」「そのために結果として的を大きくはずしている」ようにしか見受けられません。
ZDNetさんといえばそれなりにお名前も通っている会社様であると私は認識しております。
もう少し、出すモノに対する品質へのプライドとか責任感とかそういったものが向上する事を心から願ってやみません。
» 不適切なコメントを報告する
大変に手厳しい発言になり恐縮ではあるのですが。
> また、ご指摘のセキュリティ面の脆弱性についてですが、以下の資料を参考にさせていただいております。
「参考にした資料があるから問題はない」とでもおっしゃりたいのでしょうか?
一応念のために、ごく簡単にミニマムコードを書いて「実際にクラックが可能であることを確認してから」コメントを差し上げているのですが。
逆に。御社側で多少なり、そういったチェックは本当に行われているのでしょうか?
筆者様にそのような確認はちゃんととられているのでしょうか?
> もちろん、実際にはmysql_real_escape_string()のほかにも、addslashes()や文字コードへの対策などもするべきかと思います。しかし、本企画の「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識を、PHPを例に4回にわたって紹介」するという主旨をご理解頂ければ幸いです。
そういう問題ではありません。
もっと、きわめて基本的な部分で欠落がございます。
こんな生半可で半可通な知識は、まさに「生兵法は怪我の元」なだけ。こんなレベルなら、ない方がマシです。
> ほかの問題がございましたらご指摘いただければ幸いです。
ほかの問題ではなくて。前回コメントで指摘させていただいた内容が、以前の、C++の記事の初めの修正と同様「問題の本質を理解しておらず」「故に修正箇所などが全く的を射ていない」のです。
…と書き立てても御理解いただけないでしょうから、正解を書いておきます。
mysql_query("SELECT * FROM login_table WHERE id='".mysql_real_escape_string($_REQUEST['id'])."' AND password='".mysql_real_escape_string($_REQUEST['password']) . "';");
ポイントはWHERE句において文字列をシングルクォートで囲っているかいないか、です。
試しに。筆者や大野様が「問題ない」とおっしゃっている、元のソースコードで。
IDに“hoge OR (1=1”、passwordに“1) OR 1=1”という文字列を入れてみてください。
SELECT * FROM login_table WHERE id=hoge OR (1=1 AND password=1) OR 1=1;
ちなみに、修正したソースの場合、以下の通りになります。
SELECT * FROM login_table WHERE id='hoge OR (1=1' AND password='1) OR 1=1';
こんなSQLが通るものが、本当にセキュアなのですか?
これが「Webデザイナ(マークアップエンジニア含む)が少なくとも知っておきたいWebテクノロジの知識」なのですか?
「まずい」と指摘された場合に。「すでにミスを起こしてしまっている社内リソースで全てを片付ける」のではなくて、まず初めに「どこがまずいのか」を指摘者に質問するくらいの余裕があってもよろしいのではないでしょうか?
拝見しているかぎりでは。指摘を受けた後も結局は「知識的に足りない社内リソースだけで物事を片付けようとし」「そのために結果として的を大きくはずしている」ようにしか見受けられません。
ZDNetさんといえばそれなりにお名前も通っている会社様であると私は認識しております。
もう少し、出すモノに対する品質へのプライドとか責任感とかそういったものが向上する事を心から願ってやみません。
#6 大野晋一
- 2008/04/22 17:31:55
ご指摘ありがとうございます。このままでは文字列の IDやパスワードを受け付けてくれないですね。修正いたしました。
また、先の投稿のとおり、現在、正確性の担保のための施策を見直しております。さらに、今回のような公開後のご指摘に関して、がる様のおっしゃるように、ご指摘をいただいた方に協力を仰がせていただくこともあるかと思います。
いずれにせよ、貴重なご指摘をいただきまして感謝しております。
» 不適切なコメントを報告する
また、先の投稿のとおり、現在、正確性の担保のための施策を見直しております。さらに、今回のような公開後のご指摘に関して、がる様のおっしゃるように、ご指摘をいただいた方に協力を仰がせていただくこともあるかと思います。
いずれにせよ、貴重なご指摘をいただきまして感謝しております。
#7 h2ospace
- 2008/04/25 13:33:30
筆者です。
> がるさん
ご指摘、および詳しい解説をいただきましてありがとうございました。
完全に私の検証ミスで、セキュリティ以前に IDとパスワードに文字列が使えないプログラムを掲載してしまいました。
また、ご指摘の通りセキュリティ的にも大変危険なスクリプトになってしまい、大変申し訳なく思っております。今後は、しっかり気をつけて記事を執筆して参りますね。
この度は、誠にありがとうございました
» 不適切なコメントを報告する
> がるさん
ご指摘、および詳しい解説をいただきましてありがとうございました。
完全に私の検証ミスで、セキュリティ以前に IDとパスワードに文字列が使えないプログラムを掲載してしまいました。
また、ご指摘の通りセキュリティ的にも大変危険なスクリプトになってしまい、大変申し訳なく思っております。今後は、しっかり気をつけて記事を執筆して参りますね。
この度は、誠にありがとうございました
#8 thesecret
- 2008/05/10 17:46:58
PHPはそもそも「HTMLをちょっと変えれば動くようになります」という趣旨の言語ですから、
「今日からはじめて、簡単に作ってみまちた」という人はたくさん出てくるわけでして、セキュリティ上の問題など気にしない人はどんどん出てくるのは間違いないと思います。
すると、「みんなでSQLインジェクションができないように書こう!」なんてことでは、どうにもならないような気がします。
本来的にはそういうことを気にしなくても安心してサイトが作れるようになってないといけないよな、と思うのでした。
» 不適切なコメントを報告する
「今日からはじめて、簡単に作ってみまちた」という人はたくさん出てくるわけでして、セキュリティ上の問題など気にしない人はどんどん出てくるのは間違いないと思います。
すると、「みんなでSQLインジェクションができないように書こう!」なんてことでは、どうにもならないような気がします。
本来的にはそういうことを気にしなくても安心してサイトが作れるようになってないといけないよな、と思うのでした。
- 今日のトップ記事
- 2日前
- 4日前
- 6日前
- 7日前
- ホワイトペーパー
- 読者投票
いよいよ7月11日に売り出される「iPhone 3G」。今のところの購入予定は?
- 話題のタグ
Ajax
Leopard
Safari
C/C++
仮想化
Solaris
CSS
Webアプリケーション開発
Microsoft
ライブラリ
RIA
Apple
入門
ブラウザ
Ruby
server
オープンソース
フレームワーク
Internet Explorer
Mozilla
Mac OS X
Database
PHP
小技
Windows
Python
Eclipse
イロハ
Adobe
Off Topic
リファレンス
Webデザイン
Apache
Java
iPhone 3G
iPhone
MySQL
Firefox 3
SOA
JavaScript
XHTML
Firefox
HTML
Opera
Linux
iPod touch
Tips
開発環境
Google
Flash
話題のタグを見る »
MS、Vistaとの互換性をチェックできる「Compatibility Center」リリースへ
「似非」SOAを見破る10の方法
Firefox 3のアドオンやテーマ管理を容易にする
openSUSE 11.0を試してみた
フォトレポート:世界各国の優秀な技術者がパリに集結--Imagine Cup 2008世界大会
バッチ処理でデータベース活用:4つの課題と5つの解決ポイント
Rubyでどう書く?:RubyでWord文書を作成する
Techno Exchange
ZDNet Japan Green IT
DELL連載第4回〜「Microsoft System Center」
今知るべき仮想化情報
「未来の、その先」をどう提言していくか
builder編集部の大野です。初出時、2ページ目最下のソースコードにおいて、htmlspecialchars($_REQUEST['my_name'])となっていましたが、特別な理由がない限りhtmlspecialchars($_REQUEST['my_name'], ENT_QUOTES)とすべきなので、第2引数を追加しました。
確かに、タグを防ぐだけなら問題ないですが、クオート(')を防ぐにはENT_QUOTESを第2引数に指定すべきです。さらにいえば、第3引数に文字エンコーディングを指定するほうが望ましいです。つまり、次のコードがもっとも望ましいといえます。文字エンコーディングを直接ここに書き込むのはどうか、という議論もありますが……
http://jp.php.net/htmlspecialchars