(道歉,如果所有这些听起来都微不足道,我是网络编程和django的初学者)
我正在用django写一个网络前端到科学测量数据库。
所需功能的一部分是让用户能够从网页向数据库提交新的测量值。在django对Web表单的出色支持下,我有这个功能。数据通过受CSRF令牌保护的POST请求发送。
我现在正在开发相同的功能,不是通过网络表单,而是通过API访问,以便用户可以通过Python脚本批量提交新测量,而无需每次手动填写网络表单。
问题在于,由于没有表格可以填写,因此也没有CSRF令牌,django默认情况下不允许在没有它的情况下发送POST请求。
目前,我通过使用@csrf_exempt
修改API视图解决了这个问题。但我并不真正了解这样做的安全隐患。
这可能是安全隐患吗?如果是这样,怎么样?
答案 0 :(得分:1)
它具有安全风险,因为任何站点/脚本/机器人都可以发送将由您的后端处理的POST数据。
如果您希望提供公共/匿名API,那么它可能很好,您只需要特别小心处理收到的数据。
如果您希望提供用户/特定应用访问权限,则应保留CSRF令牌和/或添加其他一些安全措施。
使用CSRF令牌,您需要做的就是向系统发出第一个请求,即对用户进行身份验证的“GET”请求(以您想要的任何方式),然后返回CSRF令牌(或其他一些安全令牌)如果你想增强安全性。)
然后对您的API的所有进一步请求(对于您设置的任何会话长度,因为CSRF令牌将在特定的未使用时间范围内到期)。只需使用POST数据发送CSRF令牌(就像任何表格一样)。
编辑:
如果您使用的是标准HTML,则所有获取请求都将包含一个包含CSRFTOKEN的标题“Set-Cookie”。因此,任何通过HTTP访问API的程序都可以获取该标头,解析CSRFTOKEN,并作为数据集的一部分返回所有POST请求。