Skip to content

Commit 9141c76

Browse files
authored
Merge pull request liangliangyy#123 from liangliangyy/dev
后台增加log以及site,修复xss攻击漏洞
2 parents e5f7543 + 7be6ddb commit 9141c76

File tree

4 files changed

+160
-3
lines changed

4 files changed

+160
-3
lines changed

DjangoBlog/admin_site.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
@time: 2018/1/7 上午2:21
1414
"""
1515
from django.contrib.admin import AdminSite
16-
from django.contrib import admin
16+
from django.contrib.sites.models import Site
17+
from django.contrib.sites.admin import SiteAdmin
18+
from django.contrib.admin.models import LogEntry
19+
20+
from DjangoBlog.logentryadmin import LogEntryAdmin
1721
from blog.admin import *
1822
from accounts.admin import *
1923
from oauth.admin import *
@@ -63,3 +67,7 @@ def has_permission(self, request):
6367
admin_site.register(OAuthConfig, OAuthConfigAdmin)
6468

6569
admin_site.register(OwnTrackLog, OwnTrackLogsAdmin)
70+
71+
admin_site.register(Site, SiteAdmin)
72+
73+
admin_site.register(LogEntry, LogEntryAdmin)

DjangoBlog/logentryadmin.py

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
#!/usr/bin/env python
2+
# encoding: utf-8
3+
4+
5+
"""
6+
@version: ??
7+
@author: liangliangyy
8+
@license: MIT Licence
9+
10+
@site: https://www.lylinux.net/
11+
@software: PyCharm
12+
@file: logentryadmin.py
13+
@time: 2018/5/24 下午10:37
14+
"""
15+
from django.contrib.contenttypes.models import ContentType
16+
from django.urls import reverse, NoReverseMatch
17+
from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
18+
from django.contrib.auth import get_user_model
19+
from django.contrib.contenttypes.models import ContentType
20+
from django.utils.encoding import force_text
21+
from django.utils.html import escape
22+
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
23+
from django.utils.safestring import mark_safe
24+
from django.contrib import admin
25+
26+
action_names = {
27+
ADDITION: pgettext_lazy('logentry_admin:action_type', 'Addition'),
28+
DELETION: pgettext_lazy('logentry_admin:action_type', 'Deletion'),
29+
CHANGE: pgettext_lazy('logentry_admin:action_type', 'Change'),
30+
}
31+
32+
33+
class LogEntryAdmin(admin.ModelAdmin):
34+
date_hierarchy = 'action_time'
35+
36+
readonly_fields = ([f.name for f in LogEntry._meta.fields] +
37+
['object_link', 'action_description', 'user_link',
38+
'get_change_message'])
39+
40+
fieldsets = (
41+
(_('Metadata'), {
42+
'fields': (
43+
'action_time',
44+
'user_link',
45+
'action_description',
46+
'object_link',
47+
)
48+
}),
49+
(_('Details'), {
50+
'fields': (
51+
'get_change_message',
52+
'content_type',
53+
'object_id',
54+
'object_repr',
55+
)
56+
}),
57+
)
58+
59+
list_filter = [
60+
'content_type'
61+
]
62+
63+
search_fields = [
64+
'object_repr',
65+
'change_message'
66+
]
67+
68+
list_display_links = [
69+
'action_time',
70+
'get_change_message',
71+
]
72+
list_display = [
73+
'action_time',
74+
'user_link',
75+
'content_type',
76+
'object_link',
77+
'action_description',
78+
'get_change_message',
79+
]
80+
81+
def has_add_permission(self, request):
82+
return False
83+
84+
def has_change_permission(self, request, obj=None):
85+
return (
86+
request.user.is_superuser or
87+
request.user.has_perm('admin.change_logentry')
88+
) and request.method != 'POST'
89+
90+
def has_delete_permission(self, request, obj=None):
91+
return False
92+
93+
def object_link(self, obj):
94+
object_link = escape(obj.object_repr)
95+
content_type = obj.content_type
96+
97+
if obj.action_flag != DELETION and content_type is not None:
98+
# try returning an actual link instead of object repr string
99+
try:
100+
url = reverse(
101+
'admin:{}_{}_change'.format(content_type.app_label,
102+
content_type.model),
103+
args=[obj.object_id]
104+
)
105+
object_link = '<a href="{}">{}</a>'.format(url, object_link)
106+
except NoReverseMatch:
107+
pass
108+
return mark_safe(object_link)
109+
110+
object_link.admin_order_field = 'object_repr'
111+
object_link.short_description = _('object')
112+
113+
def user_link(self, obj):
114+
content_type = ContentType.objects.get_for_model(type(obj.user))
115+
user_link = escape(force_text(obj.user))
116+
try:
117+
# try returning an actual link instead of object repr string
118+
url = reverse(
119+
'admin:{}_{}_change'.format(content_type.app_label,
120+
content_type.model),
121+
args=[obj.user.pk]
122+
)
123+
user_link = '<a href="{}">{}</a>'.format(url, user_link)
124+
except NoReverseMatch:
125+
pass
126+
return mark_safe(user_link)
127+
128+
user_link.admin_order_field = 'user'
129+
user_link.short_description = _('user')
130+
131+
def get_queryset(self, request):
132+
queryset = super(LogEntryAdmin, self).get_queryset(request)
133+
return queryset.prefetch_related('content_type')
134+
135+
def get_actions(self, request):
136+
actions = super(LogEntryAdmin, self).get_actions(request)
137+
if 'delete_selected' in actions:
138+
del actions['delete_selected']
139+
return actions
140+
141+
def action_description(self, obj):
142+
return action_names[obj.action_flag]
143+
144+
action_description.short_description = _('action')
145+
146+
def get_change_message(self, obj):
147+
return obj.get_change_message()
148+
149+
get_change_message.short_description = _('change message')

templates/blog/tags/article_info.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ <h1 class="entry-title">
3838

3939
<div class="entry-content" itemprop="articleBody">
4040
{% if isindex %}
41-
{{ article.body|custom_markdown|truncatechars_content }}
41+
{{ article.body|escape|custom_markdown|truncatechars_content }}
4242
<p class='read-more'><a
4343
href=' {{ article.get_absolute_url }}'>Read more</a></p>
4444
{% else %}

templates/comments/tags/comment_item.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
{{ comment_item.created_time }}
2525
</div>
2626

27-
<p>{{ comment_item.body |custom_markdown }}</p>
27+
<p>{{ comment_item.body |escape|custom_markdown }}</p>
2828

2929
<div class="reply"><a rel="nofollow" class="comment-reply-link"
3030
href="javascript:void(0)"

0 commit comments

Comments
 (0)