コンウェイとピーターの狭間で

ずっと放置しつつQiitaに移ったりしていましたが、スマートホームについて書いていこうかと

セマンティックバージョニングをファイル名につける場合の問題

セマンティックバージョニングのビルドメタデータ

前回の記事でセマンティックバージョニングに注目していると書きました。

セマンティックバージョニングとは・・・

メジャー.マイナー.パッチ[-プレリリース][+ビルドメタデータ]

という形で表すバージョン番号で、バージョン比較に影響しないビルドメタデータというのが 良いなと思っていました。

たとえば、

  • リビジョンNo
  • JenkinsのビルドNo
  • ビルドしたPC
  • ビルドしたユーザ

といった情報をメタデータに埋め込めれば、同じバージョン番号でも実は違うものということが表現できそうです。 (後半2つに関しては違っていては本来困りますが)

セマンティックバージョニングをファイル名につける場合の問題

Jenkins等のCIサーバを使って自動ビルドをしていると日々インストーラが出来上がるので それらを区別するためにファイル名にバージョン番号を付けたいですよね?

そのバージョン番号は前3つの数字の意味が決まっているので、ビルドNoやリビジョンNoはビルドメタデータになります。 ビルドメタデータは先頭に"+"を付けるわけですが、この"+"が曲者になります。

"+"のついたファイルを、IIS上にアップロードしてアクセスしてみると・・・

f:id:banban525:20150105224351j:plain

HTTP エラー 404.11が返ってきてアクセスできません。 どうも、"+"を含むURIIISのデフォルト設定ではセキュリティ上禁止されているようです。 "+"のパーセントエンコードである%2Bにしても同様でした。

もちろん、設定をOFFにすることはできるのですが、理由があってこの設定になっているはずで、安易にOFFにするのは良くないでしょう。

ということで、セマンティックバージョニングとURIというのはいまいち相性がよくないようです。

ダブルエスケープシーケンスって?

ダブルエスケープシーケンス、調べてみてもOFFにする方法はすぐヒットしますが、 何が問題で禁止されているか、いまいち要領を得ません。

少し調べてみて、ここのサイトによるとASP.NET MVCではURIの一部が変数としてコントローラに渡されるので、 SQLインジェクションにつながるから危険よと書いてそうです。そういうことなんでしょうかね。 ただ、なぜ"+"がダメなのかまではわかりませんでしたが。

asp.net - double escape sequence inside a url : The request filtering module is configured to deny a request that contains a double escape sequence - Stack Overflow