2017-11-21 26 views
2

私はYesodを使用して個人的なバックアップシステムを作成しています。私はハスケルに関しては比較的経験がないので、これがどれも最適ではないと確信しています。ここで入力に自動的に引用符が追加されました

が私のハンドラの1つである:

postHostR :: Text -> RcPath -> Handler Text 
postHostR hostName f = do 
    hostId <- insertIfDontExist hostName 
    tBody <- (T.pack . show) <$> getRawRequest 
    time <- lift getCurrentTime 
    newId <- runDB $ insert $ RcFile hostId tBody (makePath f) time 
    return $ T.pack $ show newId 

私がDBから取得したテキストのいずれかが二重引用符が自動的に追加されています。私はこれが何らかのXSSセキュリティであると仮定していますが、私はページをレンダリングしないので心配しません。引用符は実際にテキストの一部ではないようです(私は最初と最後の文字を取り除いてみましたが、引用符を実際には削除していないようです)。

ありがとうございます!

+4

のせいですが、私は慣れていないんだよ。

(ここから伝えるのは難しいのです。その後、再び、私は型シグネチャについて完全に誤解される可能性があり)パッケージが含まれています。 'show'はどんなタイプですか?それぞれの呼び出しを '(show :: _)'に変更し、エラーを調べることで見つけることができます。 – dfeuer

+2

ほとんどの間、 'newId'は' Text'か 'String'です。 'show" abc "==" \ "abc \" " –

+0

確かに、どちらも正しいです。私は 'Text'型のものに' show'を行っていました。本当に行うべきことは 'unpack'を使って実際の文字列を得ることです。あなたの誰かがその質問に答えてくれますか? –

答えて

4

この問題の通常の原因は、文字列があり、必要がないときにshowという名前が付けられていることです。 (彼らは本当にputStrLn xを望んでいたとき、最も典型的には、誰かがprint xを行います。)

あなたのケースでは、私は型シグネチャがわからないんだけど、私はあなたの最後の行が

return $ T.pack $ show newId 

から変更することができることを疑いただ

return newId 

に私はそうを呼び出し、newIdはすでにTextである疑いがありますそれにだけで不要な引用符が置かれます(Stringに変換され、次にT.packを使用してTextに戻ります)。あなたがそれを返すだけなら、おそらくうまくいくでしょう。

私はそれらの `show`呼び出しの1推測している
+0

私のケースでは、私は現在 'unpack 'でなければならないことに、' Text'で 'show'を使っていました。あなたの答えはまだ成り立ちます。ありがとう。 –

関連する問題