Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions src/bisql/query.clj
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,14 @@
(throw (ex-info "Literal string values must not contain single quotes."
{:parameter (parameter-key parameter-name)
:value value})))
(when (str/includes? value "\\")
(throw (ex-info "Literal string values must not contain backslashes."
{:parameter (parameter-key parameter-name)
:value value})))
(when (str/includes? value "\0")
(throw (ex-info "Literal string values must not contain NUL characters."
{:parameter (parameter-key parameter-name)
:value value})))
{:sql (str "'" value "'")
:params []})

Expand All @@ -423,8 +431,21 @@

(defn- render-raw-variable
[template-params parameter-name]
{:sql (str (parameter-value template-params parameter-name))
:params []})
(let [value (str (parameter-value template-params parameter-name))]
(when (str/includes? value ";")
(throw (ex-info "Raw variable values must not contain semicolons."
{:parameter (parameter-key parameter-name)
:value value})))
(when (str/includes? value "--")
(throw (ex-info "Raw variable values must not contain line comment sequences."
{:parameter (parameter-key parameter-name)
:value value})))
(when (str/includes? value "/*")
(throw (ex-info "Raw variable values must not contain block comment sequences."
{:parameter (parameter-key parameter-name)
:value value})))
{:sql value
:params []}))

(defn- render-variable
[template-params sigil parameter-name collection?]
Expand Down
64 changes: 64 additions & 0 deletions test/bisql/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,70 @@
(is (= "^" (:sigil (ex-data error))))
(is (= false (:collection? (ex-data error))))))

(deftest render-query-rejects-raw-values-with-semicolons
(let [error (try
(bisql/render-query
{:sql-template "SELECT * FROM users ORDER BY /*!order-by*/id"}
{:order-by "id; DROP TABLE users"})
nil
(catch clojure.lang.ExceptionInfo ex
ex))]
(is (= "Raw variable values must not contain semicolons."
(ex-message error)))
(is (= :order-by (:parameter (ex-data error))))
(is (= "id; DROP TABLE users" (:value (ex-data error))))))

(deftest render-query-rejects-raw-values-with-line-comments
(let [error (try
(bisql/render-query
{:sql-template "SELECT * FROM users ORDER BY /*!order-by*/id"}
{:order-by "id -- malicious"})
nil
(catch clojure.lang.ExceptionInfo ex
ex))]
(is (= "Raw variable values must not contain line comment sequences."
(ex-message error)))
(is (= :order-by (:parameter (ex-data error))))))

(deftest render-query-rejects-raw-values-with-block-comments
(let [error (try
(bisql/render-query
{:sql-template "SELECT * FROM users ORDER BY /*!order-by*/id"}
{:order-by "id /* malicious */"})
nil
(catch clojure.lang.ExceptionInfo ex
ex))]
(is (= "Raw variable values must not contain block comment sequences."
(ex-message error)))
(is (= :order-by (:parameter (ex-data error))))))

(deftest render-query-rejects-literal-strings-with-backslashes
(let [error (try
(bisql/render-query
{:sql-template "SELECT * FROM users WHERE type = /*^type*/'A'"}
{:type "BO\\OK"})
nil
(catch clojure.lang.ExceptionInfo ex
ex))]
(is (= "Literal string values must not contain backslashes."
(ex-message error)))
(is (= :type (:parameter (ex-data error))))
(is (= "BO\\OK" (:value (ex-data error))))
(is (= "^" (:sigil (ex-data error))))
(is (= false (:collection? (ex-data error))))))

(deftest render-query-rejects-literal-strings-with-nul-characters
(let [error (try
(bisql/render-query
{:sql-template "SELECT * FROM users WHERE type = /*^type*/'A'"}
{:type (str "BO" \u0000 "OK")})
nil
(catch clojure.lang.ExceptionInfo ex
ex))]
(is (= "Literal string values must not contain NUL characters."
(ex-message error)))
(is (= :type (:parameter (ex-data error))))))

(deftest render-query-rejects-unsupported-literal-types
(let [error (try
(bisql/render-query
Expand Down