後づけで「セキュアプログラミング」と言うからダメということか

高木浩光氏のプログラミング解説書籍の脆弱性をどうするかを読んでなるほど、と思った。

実際のところ私もセキュアなコードを書けますか?と言われたらあまり自信が無い程度のプログラマである*1

そんな私も、世の中のプログラム書く人たちもおそらく、新しい言語を習得するときにたいていは書籍なりWebなりで「初心者向けの入門記事」を読む。けれど、そのサンプルコードがセキュアでなければそのコードをそのまま「お手本」として実際のシステムに使ってしまい、結果的に脆弱性ができてしまう。

高木氏の日記はたまにしか読まないので氏の主張を取り違えているかもしれないが、氏は「”セキュアプログラミング”だとか、「セキュアに書く」事を通常のプログラミングと比べて特別視しているのが問題で、「セキュアに書く」事はプログラミングの前提条件である」と兼ねてから言われていると捉えている。

そうだとするとたしかにその通りで、「セキュアプログラミング」だとか「サニタイズ」とかあえて「プログラミング」とは別の言い方をしてしまうと、何か特別なもの、あくまで付加的なものとして捉えてしまう可能性があるのだろう。

特に、あるプログラミング言語に対する初学者についてはサンプルコード*2が全ての取っかかりになると思う。そして「あ、こういう書き方をすればいいのか」と覚えてしまうと、そのサンプルコードに問題があっても本人が気づく可能性はそれほど高くない*3。だから、その書き方を拡大再生産してしまう。

初学者に「あ、こういう書き方をすればいいのか」と覚えさせる時点で、問題の起こらないコードを提示しておかないといけないということだ。例えそれが、見た目だけだと簡潔に見えないコード(PHPのhtmlspecialchars()でいちいち囲むとか)だとしても、「そういう書き方をするものなのだ」と思わせてしまえば、その後は本人はそれを面倒だとは思わずに「そういうものだから」とコードを書いていくだろう。

つまり、「セキュアプログラミング」うんぬんというのが話題になるのは、昔からプログラミングをしてきた人、私も含めてにとってセキュアプログラミングが「新しい概念」に見えてしまうからだ。プログラミング歴が長い人ほど、セキュアなコードを書くということに敷居の高さを覚えてしまうんじゃないだろうか。

昔はそこまでセキュアという概念が深刻なものでは無かったはずだ。Perlでアクセスカウンタとか掲示板CGIとか簡単なWebアプリしか無かったころは「HTMLタグを許すと荒らされる原因になるから削除しよう」くらいの認識だったと思う。

それがWebアプリの普及や高度化で、ECサイトや企業システムとかで使われるようになるとこれらの脆弱性の影響がクリティカルなものになった。そこで初めて「セキュアなプログラミング」というものがフォーカスされ、盛んに叫ばれることになったのだろう。

そうすると、昔からそんなのを特に考えずにプログラミングをしてきた人達は「セキュアプログラミング」という「新しいもの」を覚えないといけなくなったわけで、これは入門用の書籍を書いている人も例外ではないだろう。

自分のプログラミングスキルに後づけで「セキュア」を取り込むと、「セキュアプログラミング」は付加的なものに見えてしまいがちなのではないだろうか。そういうところが「書籍のサンプルコードは簡単なものでも良い」という、もはや初学者に対する「余計なおせっかい」な考えに繋がっているのではないか。

つまり「セキュアなこと」は付加的なものでなく、もはや前提になっている時代なのに、下手に長くプログラムをやって来たばかりに「セキュア」なコードは初学者には理解しづらいのではないかという考えをしてしまうことがあるのかもしれない。

逆にこれからプログラミングを学習していく世代は、いちばん最初に触れるサンプルコードで正しいコードを提示されればそのやり方を踏襲してプログラミングしていくだろう。

自戒を込めて、意識を変えないといけないのは今までプログラミングをしてきた経験者であって、新しく学習する人ではない。初学者に教える立場なのは経験者であるから、経験者の意識を早く変えていかないといけないということに尽きるのではないか。

  • *1: なのでいまさらながら勉強中
  • *2: 書籍やWeb上のに限らず、仕事の現場ならそこにある既存のコードも
  • *3: 初学者だから。もちろん、他の言語の経験豊富な人はその経験と勘で気づくかも知れないが
タイトルとURLをコピーしました