fail on >100 input lengths

This is already limited by <input> on frontend so it only happens if the user
deliberately crafts a malicious request
This commit is contained in:
Jack Wines 2023-06-16 20:22:31 -07:00
parent a84c096968
commit 69d5795eed
2 changed files with 15 additions and 2 deletions

View file

@ -13,3 +13,6 @@ badPollId = throwError . withReason err400 . T.append "not a valid id: " . T.pac
noPollFound :: P.PollId -> AppM a noPollFound :: P.PollId -> AppM a
noPollFound = throwError . withReason err404 . T.append "invalid id, no poll with id: " . T.pack . show noPollFound = throwError . withReason err404 . T.append "invalid id, no poll with id: " . T.pack . show
nameTooLong :: AppM a
nameTooLong = throwError . withReason err400 $ "poll field was too long"

View file

@ -34,6 +34,11 @@ import qualified Network.HTTP.Types.Status as TS
import LucidUtils import LucidUtils
import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy as TL
checkLength :: T.Text -> AppM ()
checkLength txt
| (T.length txt) <= 100 = pure ()
| otherwise = Er.nameTooLong
throwOrLift :: AppM a -> Maybe a -> AppM a throwOrLift :: AppM a -> Maybe a -> AppM a
throwOrLift err = My.maybe err pure throwOrLift err = My.maybe err pure
@ -86,9 +91,9 @@ nthPlaces =
with span_ [classes_ ["third-place", "badge"]] "3rd"] with span_ [classes_ ["third-place", "badge"]] "3rd"]
++ map (\n -> with span_ [class_ "badge"] . toHtml $ T.append (T.pack . show $ n) "th") [4 :: Int ..] ++ map (\n -> with span_ [class_ "badge"] . toHtml $ T.append (T.pack . show $ n) "th") [4 :: Int ..]
makePoll :: P.CreatePollInfo -> AppM (L.Html ()) makePoll :: P.CreatePollInfo -> AppM (L.Html ())
makePoll pollReq = do makePoll pollReq = do
checkTextLengths
db <- Rd.asks db db <- Rd.asks db
gen <- Rd.asks gen gen <- Rd.asks gen
pollId <- P.PollId <$> R.uniformWord64 gen pollId <- P.PollId <$> R.uniformWord64 gen
@ -97,13 +102,18 @@ makePoll pollReq = do
pure . div_ $ do pure . div_ $ do
"done! people can fill out your poll at " "done! people can fill out your poll at "
with a_ [href_ fillOutLink] (toHtml fillOutLink) with a_ [href_ fillOutLink] (toHtml fillOutLink)
where
checkTextLengths = do
M.mapM_ checkLength . LN.toList . P.options $ pollReq
checkLength . P.question $ pollReq
maybe (pure ()) checkLength . P.title $ pollReq
toPollIdLink :: P.PollId -> T.Text toPollIdLink :: P.PollId -> T.Text
toPollIdLink (P.PollId pollId) = T.append "https://rankedchoice.net/poll/" (T.pack . show $ pollId) toPollIdLink (P.PollId pollId) = T.append "https://rankedchoice.net/poll/" (T.pack . show $ pollId)
vote :: P.PollId -> B.Ballot -> AppM (L.Html ()) vote :: P.PollId -> B.Ballot -> AppM (L.Html ())
vote pollId ballot = do vote pollId ballot = do
M.mapM_ checkLength . B.options $ ballot
db <- Rd.asks db db <- Rd.asks db
liftIO $ Ac.update db (DB.PostBallot pollId ballot') liftIO $ Ac.update db (DB.PostBallot pollId ballot')
pure $ with div_ [id_ "resultLink"] $ do pure $ with div_ [id_ "resultLink"] $ do