2013-10-30 63 views
1

我在橋接R和psql,希望移除sql注入漏洞。看着文件,我曾希望:Rpostgresql:正確地轉義輸入字符串

postgresqlExecStatement(con, statement, params, ...) 

將允許使用的是這樣的:

postgresqlExecStatement(con, "DELETE FROM foos WHERE id = ? AND baz = ?", c(1, "bar")) 

但不幸的是這似乎並沒有工作。也許我對參數使用了錯誤的 符號(除?之外的其他符號)。

我發現

最好的折衷辦法是通過逃避字符串:

postgresqlEscapeStrings(con, string) 

(注:連接是必要的,這樣函數可以知道如何正確逃生)。

意味着我必須逃脫每一個我使用粘貼時使用的字符串,當我把我的查詢放在一起 。不那麼優雅。但似乎是最好的選擇。任何人有其他 想法?

+0

您可能想要嘗試https://github.com/rstats-db/RPostgres-它完全支持參數化查詢並實現dbi通用的'dbQuoteString()'和'dbQuoteIdentifier()' – hadley

回答

0

使用

postgresqlExecStatement(con, "DELETE FROM foos WHERE id = $1 AND baz = $2", list(1, "bar")) 

我總是把我的參數被綁定爲一個列表,因爲c將迫使它變成一種模式。如果此語句成功,您必須清除屬於con的結果,然後才能再次使用它。

另外,請注意哈德利的意見,以使用新的包裝RPostgres

+0

我不認爲這將工作,因爲參數化查詢通常只能插入值,而不是參數(即表名) – hadley

+0

你是對的。我從一個角度回答,應該使用'$ n',其中'n'是一個整數,用'postgresqlExecStatement'構造參數化查詢。 – Alex

+1

感謝您的評論。你的回答很好。我編輯了我的問題以刪除傳遞的表名被轉義的有些不合理的請求。 – shf8888