![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
php言語の脆弱性について
パスワード認証において、phpのstrcmp, strcasecmpといった関数には脆弱性があると聞きます。
そこで、具体的にどのような脆弱性があるのかお伺いしたいと思います。
たとえば、認証画面にパスワードの送信フォームがあり、パスワードが分からない場合
$pass = ****
if (isset($_POST['pass']))
if (strcasecmp($_POST['pass'], $pass) == 0)
echo "Correct!";
else
echo "Incorrect"
というプログラムになっていた場合、送信フォームにどのような文字列を渡せば認証が通るのでしょうか。
また、認証が通る仕組みについても教えていただけたらと思います。
No.4ベストアンサー
- 回答日時:
strcmpは型のチェックが厳格でないという仕様上の問題がありますが、それが実際に脆弱性になる *自然な* 例を作ることは容易ではありません。
strcmpによる比較が「おかしい」例として下記があります。
<?php
$a = 8498209348989438;
$b = 8498209348989439;
var_dump($b - $a);
var_dump(strcmp($a, $b));
この結果は下記となります。
float(1)
int(0)
すなわち、異なる数値であるのにも関わらず結果は「等しい」となっています。
しかし、これは入力が数値(float)であるものを文字列にキャストしているからおかしくなっているわけであって、わざわざstrcmpによる比較をすることが不自然です。
では、さっきの例を文字列型で比較するとどうなるかというと、
$a = '8498209348989438';
$b = '8498209348989439';
var_dump(strcmp($a, $b));
この結果は以下となります。これは期待した通りの結果です。
int(-1)
Webアプリケーションの場合、入力値はキャストしない限り文字列として扱われますから、問題は起きないと考えられます。
以上はWebアプリケーションの通常のケースの話ですが、様々なアプリケーションの中には、文字列と思っていた変数に整数や浮動小数点数が入っている可能性もあり得るため、原則として strcmp ではなく === で比較した方がよいということはあります。
まとめますと、strcmpを使うと予期しない結果になることがあるため === を使った方が安全ですが、そんなに簡単に strcmp で破綻が起きると言うことはありません。
参考URL:http://d.hatena.ne.jp/hnw/20090123
No.3
- 回答日時:
> 参照したサイトは色々有りますが、こちらのサイトが簡潔にまとまっていると思います。
> http://firstjun.blog.shinobi.jp/php/php%20strcmp …
そのサイトは、strcmp関数の実際の動作をまとめ、その動作も仕様通りであることが
確認できた旨が報告されているだけで、脆弱性があるなどと一言も書かれていません。
普通、「関数に脆弱性がある」というのは、その関数が仕様通りでない動作を
することがあったり、その関数の仕様自体に不備がありプログラマーの
コーディングで危険を回避できないような仕様になっている場合を言います。
例えば、有名なのはC言語のgets関数です。
(参考)
http://ja.wikipedia.org/wiki/Gets
関数そのものに脆弱性があるということと、その関数を使って作ったあなたのプログラムに
脆弱性があるということは、全く別の話です。
あなたが知りたいのは、strcmpにどのような脆弱性があるかではなく、
strcmpについてどのような使い方をすると自分のプログラムに
脆弱性を作ってしまうのか?
と言うことではないのでしょうか?
> 要は、phpの「緩やかな比較」という仕様に脆弱性があるのではないかと思ったのです。
それは「緩やかな比較」に脆弱性があるのではなく、「緩やかな比較」という
仕様を意識してコーディングしないと、あなたのプログラムにバグ(ひいては脆弱性)を
作ってしまう可能性があるということです。
で、質問に掲示されたプログラムは「$_POST」が元々文字列として格納されているものであり、
おそらく$passもパスワード文字列を格納していることが前提だと思います。
そうであれば文字列同士をstrcasecmpで比較しているだけであり、「緩やかな比較」で
注意すべき問題点にも当たりません。
注意すべきは、文字列として格納されていないものをstrcmp関数で比較した時に、
自動的に文字列に変換して比較されるということです。
そこを意識してコーディングすれば何も問題ないし、
逆にそこを意識しないでコーディングするとバグ(ひいては脆弱性)を作ってしまう
可能性があるので注意してくださいということです。
No.2
- 回答日時:
phpのstrcmp, strcasecmpに脆弱性があるなんて聞いたことないんですが、
どこからの情報ですか? それを補足してください。
Webページの情報なら、URLを示してください。
もしかすると、その情報のあなたの解釈に誤りがあるのかもしれません。
> 送信フォームにどのような文字列を渡せば認証が通るのでしょうか。
そのプログラムの送信フォームに特定の文字列を渡せば、常に認証が通る
ようにできるとお考えなのでしょうか?
それは、どこかに書かれてあったのですか?
それとも、あなたができるのではないかと想像して聞いているのですか?
なんとなくSQLインジェクションのことを勘違いして捉えているような
気もします。このキーワードも調べてみてください。
この回答への補足
参照したサイトは色々有りますが、こちらのサイトが簡潔にまとまっていると思います。
http://firstjun.blog.shinobi.jp/php/php%20strcmp …
要は、phpの「緩やかな比較」という仕様に脆弱性があるのではないかと思ったのです。
ですから、このプログラムはある操作で必ず認証が通るという考えではなく、このプログラムにもどこか脆弱性があるのではないかと想像して考えたのです。
私の考えですが、SQLインジェクションの問題とは関係ないと思われます。
No.1
- 回答日時:
まずは検索してみてください。
関数名 脆弱性
とでもこの質問の内容を書くくらいなら検索した方が良いです。
また、多くのわかる人は自分で調べて分かるようになっただけなので、自分で調べずに聞く人を嫌う傾向にあると思います。
この回答への補足
補足が足りず申し訳ありません。
実はこの問題には丸一日壁にぶち当たっていたのでした。
もちろん「関数名 脆弱性」でも検索しましたし、他にもいろいろな方法で調べましたが分かりませんでした。自分の調べる力の無さを痛感しております。
ですから、決して「自分で調べずに」質問しているわけではありません。誤解をさせてしまい、申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで=より左の文字を一括で...
-
エクセルでアルファベットか数...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
VBAでの Replace関数で、ワイル...
-
【Excel VBA】複数ある特定の文...
-
エクセルで文字列をtxtファイル...
-
文字列からタブコードを取り除...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列の最大値を抽...
-
VBの「As String * 128」とは?
-
Left関数とRight関数を合わせた...
-
Pro c/c++ でホスト変数の後に....
-
同一セル内に関数と文字列を同...
-
C#で年月を比較する
-
エクセルでセル内の文字列の最...
-
VBA テキストボックスの計算
-
アクセスで特定の数字以外(複...
-
Excelで偶数行だけ文字列を数え...
-
VBscriptからバッチに変数を渡...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
同一セル内に関数と文字列を同...
-
アクセスで特定の数字以外(複...
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
ORCLEでの小数の表示方法の変更...
-
エクセル 数値データを桁をそ...
-
VBの「As String * 128」とは?
-
CStringの文字列検索&抜き出し...
-
エクセルでセル内の文字列の最...
-
Msgboxの×が押されたとき
おすすめ情報