我之前改造了kstateome/django-cas,使其适合Open edX使用(wwj718/django-cas),今早去某高校,讨论些东西,期间谈到需要可能更改cas的既有逻辑,于是回来重新翻了下wwj718/django-cas的源码,发现其中有一个潜在的安全隐患

隐患的代码为user = User.objects.create_user(username, ‘’)

后果

所有由CAS引入系统的用户,初始化密码为空!可以在Open edX的默认登录系统中被无密码登录

触发条件

可能触发隐患的上下文是,系统采用cas的同时,还保留了原始的登录系统,而且默认情况就是如此

CAS的登录入口和edx默认的登录路口是并列关系(这可能带来很多问题)

1
2
3
4
5
6
:::text
urlpatterns += (
# CAS
url(r'^accounts/login/$', 'cas.views.login', name='login'),
url(r'^accounts/logout/$', 'cas.views.logout', name='logout'),
)

注意url里的name,会覆盖原先的reverse,这是django的url机制引起的

策略

把cas作为唯一的登录方式,基本的做法是,覆盖原先的登录入口(修改url,注视掉原先的登录入口,不过edx的登录是以ajax的方式,禁用url可能还不够安全,更多细节我暂时没时间查看),更为彻底的做法是禁用django的默认认证后端

todo

模仿mitocw/django-cas的做法,不允许密码登录

1
2
3
4
5
:::text
user = User(username=username, email=username)
user.set_unusable_password()
...
user.save()

值得一提的是mitocw/django-cas也用了django的User,这样一来,不还是有关联profile的问题么