使用SQLAlchemy時緩解SQL注入攻擊的最佳做法是什麼?SQLAlchemy + SQL注入
回答
如果您有任何「特殊」字符(如分號或撇號 )的數據,他們將 自動被 SQLEngine對象引用你的,所以你不必 擔心引用。這也意味着 ,除非你刻意繞過 SQLAlchemy的引用機制, SQL注入攻擊基本上是 不可能的。
答案表示引用來自「the」文檔,當它沒有時:它似乎來自[教程](http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html )不與SQLAlchemy關聯。其次,引用是在正確處理轉義的SQLAlchemy API的一部分的上下文中,使用處理轉義的示例。但是,仍然可以使用'execute()'或其他不會被SQLAlchemy轉義的文字數據。是的,在大多數情況下,SQLAlchemy會自動轉義,但如果您使用的是文字或原始SQL,您仍然可以在腳下自我拍攝。 –
tldr:避免生SQL儘可能。
接受的答案是懶惰和不正確的。過濾器方法接受原始SQL,如果以這種方式使用,則完全容易受到SQL注入攻擊。舉例來說,如果你是從URL接受值和原始的SQL的過濾器結合起來,你是開放的攻擊:
session.query(MyClass).filter("foo={}".format(getArgs['val']))
使用上面的代碼和下面的網址,你會將SQL注入到過濾器語句中。上面的代碼將返回數據庫中的所有行。
http://domain.com/?val=2%20or%201%20=%201
爲了增加@Tendrid answer。我使用安靜的天真方法做了一些調查。 filter
方法有*criterion
作爲它的參數,其他幾個ORM查詢方法也有類似的說法。
在filter
方法的情況下*criterion
參數結束傳遞到_literal_as_text,在字符串的情況下 - 將其標記爲安全的SQL(請糾正我,如果我錯了)。因此它使它不安全。
這裏是*criterion
說法ORM Query class法調查的結果:可能的方法missuses
filter - uses _literal_as_text (NOT SAFE)
having - uses _literal_as_text (NOT SAFE)
distinct - uses _literal_as_label_reference (NOT SAFE)
group_by - uses _literal_as_label_reference (NOT SAFE)
order_by - uses _literal_as_label_reference (NOT SAFE)
join - uses model attributes to resolve relation (SAFE)
例子(保持它的簡單,字符串格式化跳過):
db.session.query(User.login).group_by('login').having('count(id) > 4; select name from roles').all()
db.session.query(User.login).distinct('name) name from roles /*').order_by('*/').all()
db.session.query(User.login).order_by('users_login; select name from roles').all()
db.session.query(User.login).group_by('login union select name from roles').all()
注意如果傳遞字符串文字,這些方法只是不安全的。
- 1. pandas中的SQL注入;在SQLAlchemy的
- 2. ORM和SQL注入
- 3. SQL注入插入
- 4. SQL注入
- 5. SQL注入mysql_real_escape_string
- 6. Hibernate SQL注入
- 7. TableAdapters SQL注入
- 8. SQL Server注入
- 9. EJB3 SQL注入
- 10. Rails SQL注入?
- 11. SQL注入vulnerablities
- 12. php sql注入
- 13. SQL注入bwapp
- 14. SQL注入法
- 15. JPA SQL注入
- 16. PHP - SQL注入
- 17. SQL注入
- 18. DocumentDB Sql注入?
- 19. SQL注入2.0
- 20. DVWA sql注入
- 21. Sql注入group_concat
- 22. 盲SQL注入
- 23. 笨SQL注入
- 24. mysqli_stmt_bind_param SQL注入
- 25. MSAccess SQL注入
- 26. SQLAlchemy事件註冊
- 27. SQL注入的OData關注
- 28. Linq到SQL和SQL注入
- 29. SQL注入$ db-> query($ sql)?
- 30. SQL防止SQL注入
使用SQLAlchemy *是最佳實踐。 :-) –