這是admitted是準備語句提供對SQL注入和手動進變量一個很好的保護到使用PG::Connection#exec一個SQL查詢邪惡,應該永遠來完成。PG :: Connection#exec_params在防範SQL注入方面與使用預準備語句相同?
但是PG::Connection#exec_params呢?它是否提供了與準備好的聲明相同級別的sql注入防護?
如果它確實提供了針對sql注入的保護,它是否始終如此,或者只有在顯式綁定參數時纔是正確的?
這是admitted是準備語句提供對SQL注入和手動進變量一個很好的保護到使用PG::Connection#exec一個SQL查詢邪惡,應該永遠來完成。PG :: Connection#exec_params在防範SQL注入方面與使用預準備語句相同?
但是PG::Connection#exec_params呢?它是否提供了與準備好的聲明相同級別的sql注入防護?
如果它確實提供了針對sql注入的保護,它是否始終如此,或者只有在顯式綁定參數時纔是正確的?
TL; DR yes。
我不知道Ruby驅動程序的內部細節。我認爲有三種策略可以使用。從理論上講,只有一種理論上可能發生頂級SQL注入攻擊(下面會詳細介紹這一點),但所有這些攻擊都可能容易受到較低級SQL注入攻擊的影響,就像準備好的語句一樣。
要理解這一點,你需要了解的PostgreSQL如何執行查詢:
在準備好的聲明中,計劃被保存,但這不是什麼使他們安全。什麼使他們對頂級攻擊安全是因爲這些參數是從查詢中分離發送的以便被解析。
第一個策略可能是服務器端準備語句。在這種情況下,計劃將被保存並且可能被重用,這可能具有不希望的(或期望的)性能影響。
第二個是PostgreSQL協議允許查詢和參數分開發送,即使不使用預處理語句。這具有相同的安全優勢,但不允許計劃重用。看看代碼,這看起來就像這種方法的首選方式。
第三是你可以讓客戶端逃脫。因爲它可能位於中心位置等等,所以它比任何你自己會做的都更安全。我知道Perl的DBD :: Pg可以回退到這個位置,但幾乎從不這樣做。我沒有看到倒退,但也許有一個我錯過了。因此,一般來說,我會說是的,即使使用最差的方法,這也確實提供了可比的益處。
注意我一直在討論頂級攻擊。如果你在某處(例如觸發器)調用某個函數,那麼你也可以使用SQL注入。這發生在涉及動態SQL的地方,但通常不是問題。上述方法都不能防止這種情況發生,因爲規劃階段將作爲上述執行階段的子部分並且參數始終填充。
這就是爲什麼在應用程序的所有級別上的良好編碼實踐都是爲什麼重要。
非常明確的答案!非常感謝 – Thibauld