You don't have javascript enabled. Good luck! :(
記事公開日: 2018/08/04
最終更新日: 2020/03/03

XSS に対するセキュリティ

サンプルの基本形式

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import Yesod

data App = App

mkYesod "App" [parseRoutes|
/check CheckR GET
|]

instance Yesod App

getCheck1R :: Handler Html
getCheck1R = defaultLayout $ do
  mParam <- lookupGetParam "p"

  [whamlet|
    ここに各種処理を書きます。
  |]

main :: IO ()
main = warp 3000 App

雛形は上記を使います。

HTML のエスケープ

テンプレート

[whamlet|
  #{maybe "" id mParam}
|]

URL

http://localhost:3000/check1?p=<script>alert(document.cookie)</script>

結果

上記のURLでアクセスした場合は以下のように <> がエスケープされる。

&lt;script&gt;alert(document.cookie)&lt;/script&gt;

そのため XSS は発生しない。(エスケープについての詳しい流れは変数展開処理の流れを参照してください)

画面の書き換え

テンプレート

[whamlet|
  <form action="" method="POST">
    氏名<input name="name" value="#{maybe "" id mParam}"><br>
|]

URL

http://localhost:3000/check2?p="></form>XSS"

結果

以下のようにエスケープ処理 (", <, >) が行われるため、安全

value="&quot;&gt;&lt;/form&gt;XSS&quot;"

引用符で囲まれない属性値のXSS

テンプレート

[whamlet|
  <input type=text name=mail value=#{maybe "" id mParam}>
|]

URL

http://localhost:3000/check3?p=1+onmouseover%3dalert(document.cookie)

結果

以下のように " が無い場合は自動的に追加するため、安全

<input type="text" name="mail" value="1 onmouseover=alert(document.cookie)">

href属性やsrc属性のXSS

テンプレート

[whamlet|
  <a href=#{maybe "" id mParam}>
    ブックマーク
|]

URL

http://localhost:3000/check4?p=javascript:alert(document.cookie)

結果

以下のように JavaScript のエスケープは何も行われないため、XSS が発生する。

<a href="javascript:alert(document.cookie)">ブックマーク</a>

JavaScript の動的生成

テンプレート

[whamlet|
  <body onload="init('#{maybe "" id mParam}')">
|]

toWidget [julius|
  function init(text) {
    // 適当な処理
  }
|]

URL

http://localhost:3000/check5?p='),alert(document.cookie)//

結果

JavaScript のエスケープ処理が行われないため、XSS が発生する。

<body onload="init('&#39;),alert(document.cookie)//')"></body>
<script>
  function init(text) {
    // 適当な処理
  }
</script>