パス名の脆弱性を回避する


ファイルのパスを指定するときは「C:\SWork\Sample.txt」のように記述します。

Sub Sample1()
    MsgBox Dir("C:\Work\Sample.txt")
End Sub

また、次のように「¥」の代わりに「/」を使うこともできます。

Sub Sample2()
    MsgBox Dir("C:/Work/Sample.txt")
End Sub

パスの区切りである「¥」は複数続けてもエラーになりません。

Sub Sample3()
    MsgBox Dir("C:\\\Work\\\\Sample.txt")
End Sub

「..」などの相対パスも指定できますし、そのとき存在しないパスが含まれていてもOKです。

Sub Sample4()
    MsgBox Dir("C:\Work\.\.\dummy\..\..\Sample.txt")
End Sub

こうしてみると、パスの指定はWindowsが寛容に処理してくれています。ですが、ここまで寛容でいいのでしょうか。ExcelのVBAなどで使う分にはそれほど神経質にならなくてもよさそうですが、セキュリティの面から考えると「不正のパス」を指定されるのは好ましくありません。そこで、次のような指定方法があるそうです。パスの前に「\\?\」という記号を付けると、Windowsのサービス精神を抑止できるそうです。

Sub Sample5()
    If Dir("\\?\C:/Work\\Sample.txt") = "" Then
        MsgBox "そのファイルは存在しません"
    Else
        MsgBox "ファイルは存在します"
    End If
End Sub

これが何に使えるか良い例が思いつきませんが、パスの先頭に「\\?\」を付けるという使い方を知らなかったので、かなり興味深いテクニックでした。