add english translation

This commit is contained in:
lijiejie
2022-04-10 00:08:10 +08:00
parent e5b34be344
commit c004584df0
10 changed files with 483 additions and 90 deletions
+8 -1
View File
@@ -1,6 +1,7 @@
# coding:utf-8
import os
from django.utils.translation import gettext_lazy as _
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -27,6 +28,7 @@ INSTALLED_APPS = (
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
@@ -68,12 +70,17 @@ DATABASES = {
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('zh-hans', _('中文')),
('en-us', _('English')),
)
LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),)
STATIC_URL = '/static/'
if DEBUG:
+2 -1
View File
@@ -1,6 +1,6 @@
# coding=utf-8
from django.urls import path, re_path
from django.urls import path, re_path, include
from django.contrib import admin
from logview import views
@@ -23,5 +23,6 @@ urlpatterns = [
re_path(r'^rebind/gen$', views.rebind_gen, name='rebind_gen'),
re_path(r'^as_admin/$', views.as_admin, name='as_admin'),
re_path(r'^config/update$', views.config_update, name='config_update'),
path('i18n/', include('django.conf.urls.i18n')),
re_path(r'^.*$', views.index, name='index'),
]
Binary file not shown.
+340
View File
@@ -0,0 +1,340 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-09 23:51+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: .\dnslog\settings.py:79
msgid "中文"
msgstr ""
#: .\dnslog\settings.py:80
msgid "English"
msgstr ""
#: .\logview\views.py:87 .\templates\login.html:64
msgid "登录"
msgstr "Log In"
#: .\logview\views.py:104
msgid "登录失败次数太多,锁定10分钟"
msgstr "Too many login failures, account locked"
#: .\logview\views.py:116
msgid "用户名或密码错误"
msgstr "Username or password wrong"
#: .\logview\views.py:128
msgid "随机账号功能已关闭"
msgstr "Random login disabled by admin"
#: .\logview\views.py:132
msgid "爬虫禁止登录"
msgstr "Bots login not allowed"
#: .\logview\views.py:136
msgid "随机账号超限,请注册登录"
msgstr "Random account login exceeded, please register"
#: .\logview\views.py:146
msgid "随机账号创建失败"
msgstr "Fail to generate random account"
#: .\logview\views.py:152
msgid "注册功能已关闭"
msgstr "Register disabled by admin"
#: .\logview\views.py:156
msgid "注册"
msgstr "Register"
#: .\logview\views.py:163
msgid "无法创建该账号,已被占用"
msgstr "Username Token, please choose another one"
#: .\logview\views.py:168
msgid "用户名只能包含字母或数字"
msgstr "Username must be alpha-numberic"
#: .\logview\views.py:179
msgid "注册成功,请登录以确保密码有效"
msgstr "Register succeded, please log in"
#: .\logview\views.py:222 .\logview\views.py:253
msgid "删除成功"
msgstr "Delete Success"
#: .\logview\views.py:228 .\logview\views.py:259
msgid "删除失败"
msgstr "Delete Failed"
#: .\logview\views.py:307
msgid "DNSLog管理"
msgstr "DNSLog"
#: .\logview\views.py:340
msgid "WebLog管理"
msgstr "WebLog"
#: .\logview\views.py:363
msgid "API配置"
msgstr "API"
#: .\logview\views.py:368
msgid "DNS重绑定"
msgstr "DNS Rebind"
#: .\logview\views.py:375
msgid "Payloads大全"
msgstr "Payloads"
#: .\templates\auto_reload.html:3
msgid "监视刷新"
msgstr "Auto Refresh"
#: .\templates\auto_reload.html:6
msgid "自动刷新"
msgstr "Auto Refresh"
#: .\templates\auto_reload.html:6
msgid ""
"监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请"
"在搜索结果页开启"
msgstr ""
"Auto reload webpage once new records found, you can also check this box on a "
"search result page to monitor any keywords you like"
#: .\templates\login.html:51
msgid "用户名即域名前缀,越短,越有利于绕过限制"
msgstr "Username will become your domain name prefix"
#: .\templates\login.html:53 .\templates\login.html:61
msgid "用户名"
msgstr "Username"
#: .\templates\login.html:54
msgid "邮箱"
msgstr "Email"
#: .\templates\login.html:55 .\templates\login.html:62
msgid "密码"
msgstr "Password"
#: .\templates\login.html:56
msgid "再次输入密码"
msgstr "Confirm password"
#: .\templates\login.html:58
msgid "创建用户"
msgstr "Register"
#: .\templates\login.html:59
msgid "已有账号?登录"
msgstr "Already have an account, login"
#: .\templates\login.html:66
msgid "注册新账号"
msgstr "Register new account"
#: .\templates\login.html:68
msgid "创建随机ID并登录"
msgstr "Login as random new user"
#: .\templates\login.html:73
msgid ""
"基于<a href=\"https://github.com/bugscanteam/dnslog/\" class=\"alert-link\" "
"target=\"_blank\">bugscan dnslog</a>开发"
msgstr ""
"Based on <a href=\"https://github.com/bugscanteam/dnslog/\" class=\"alert-"
"link\" target=\"_blank\">bugscan dnslog</a>"
#: .\templates\login.html:82 .\templates\views.html:373
msgid "提示"
msgstr "TIPS"
#: .\templates\login.html:88
msgid "随机账号创建后,无法再次登录,其数据可能被定期清理"
msgstr ""
"Generated random users can not login and access logs after session ends"
#: .\templates\login.html:89
msgid "如果你希望长期保存日志,可注册个人账号"
msgstr "You can register an account to save and view logs"
#: .\templates\login.html:93
msgid "确认创建"
msgstr "Sure, create random user for me"
#: .\templates\pager.html:34
#, python-format
msgid "第%(page)s页 / 共%(numpages)s页, 共%(total)s条记录"
msgstr "Page %(page)s / %(numpages)s , %(total)s records in total"
#: .\templates\pager.html:36
msgid "删除所有记录"
msgstr "Delete All Records"
#: .\templates\views.html:49
msgid "退出"
msgstr "Logout"
#: .\templates\views.html:57 .\templates\views.html:69
msgid "域名"
msgstr "Domain"
#: .\templates\views.html:58 .\templates\views.html:105
msgid "搜索"
msgstr "Search"
#: .\templates\views.html:59 .\templates\views.html:154
msgid "子域名"
msgstr "Sub name"
#: .\templates\views.html:72 .\templates\views.html:116
msgid "位置"
msgstr "Location"
#: .\templates\views.html:73 .\templates\views.html:117
msgid "时间"
msgstr "Time"
#: .\templates\views.html:74 .\templates\views.html:118
msgid "操作"
msgstr "Operate"
#: .\templates\views.html:87 .\templates\views.html:131
#: .\templates\views.html:384
msgid "删除"
msgstr "Delete"
#: .\templates\views.html:130 .\templates\views.html:401
msgid "查看"
msgstr "Details"
#: .\templates\views.html:157
msgid "开启用户注册功能"
msgstr "Enable register"
#: .\templates\views.html:158
msgid "开启产生随机账号"
msgstr "Enable generate random new user"
#: .\templates\views.html:167
msgid "单个请求命中查询"
msgstr "Single Query Check"
#: .\templates\views.html:174
msgid "设置为"
msgstr " "
#: .\templates\views.html:174
msgid "或者"
msgstr "or"
#: .\templates\views.html:175 .\templates\views.html:194
msgid "三级域名前缀"
msgstr "sub name prefix"
#: .\templates\views.html:177
msgid "检查是否触发"
msgstr "To check wheather a query was recieved, for example "
#: .\templates\views.html:177
msgid "访问"
msgstr "visit"
#: .\templates\views.html:179 .\templates\views.html:180
#: .\templates\views.html:205 .\templates\views.html:206
msgid "返回"
msgstr "Return"
#: .\templates\views.html:179
msgid "请求被触发"
msgstr "Query recieved"
#: .\templates\views.html:180
msgid "请求未触发"
msgstr "Query never recieved"
#: .\templates\views.html:187
msgid "多个请求命中查询"
msgstr "Multiple Queries Check"
#: .\templates\views.html:196
msgid ""
"对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些"
"payload触发执行成功。"
msgstr ""
"After your scanner sends large number of requests includes variaties of sub "
"names. You can check weather any dns queries were captured with only one API "
"request"
#: .\templates\views.html:198 .\templates\views.html:199
#: .\templates\views.html:200
msgid "扫描器投递"
msgstr "Test"
#: .\templates\views.html:198 .\templates\views.html:199
#: .\templates\views.html:200
msgid "使用域名"
msgstr "send requests with domain"
#: .\templates\views.html:203
msgid "检查是否存在漏洞,访问"
msgstr "To check wheather any queries were captured, visit"
#: .\templates\views.html:205
msgid "漏洞未触发"
msgstr "not vulnerable"
#: .\templates\views.html:206
msgid ",漏洞被触发,data字段包含成功触发的payload清单,至多返回50个"
msgstr "vulnerable, subs in data were queried by target"
#: .\templates\views.html:221 .\templates\views.html:229
msgid "生成域名"
msgstr "Generate Domain"
#: .\templates\views.html:227
msgid "合法IP"
msgstr "Valid IP"
#: .\templates\views.html:228
msgid "非法IP"
msgstr "Invalid IP"
#: .\templates\views.html:234
msgid "DNS监控"
msgstr "Monitor DNS Query"
#: .\templates\views.html:235
msgid "HTTP监控"
msgstr "Monitor HTTP Request"
#: .\templates\views.html:379
#, python-format
msgid " 是否清空全部 <b>%(total)s</b> 条记录?删除后数据无法恢复' "
msgstr ""
"This will delete all <b>%(total)s</b> records, data can not be recovered, "
"continue?"
#: .\templates\views.html:382
msgid "关闭"
msgstr "Close"
#: .\templates\views.html:398
msgid "收起"
msgstr "Collapse"
+22 -21
View File
@@ -19,6 +19,7 @@ from django.contrib.auth.models import User as SysUser
from django.contrib.auth import authenticate, login
from django.conf import settings
from django.contrib.auth import logout
from django.utils.translation import gettext as _
def get_city_by_ip(ip):
@@ -83,7 +84,7 @@ def do_login(request):
if userid:
return HttpResponseRedirect('/dns/')
context = {'title': '登录', 'enable_register': 'yes', 'enable_create_random_user': 'yes'}
context = {'title': _('登录'), 'enable_register': 'yes', 'enable_create_random_user': 'yes'}
c = Config.objects.filter(name='enable_register')
if c and 'no' == c[0].value:
context['enable_register'] = 'no'
@@ -100,7 +101,7 @@ def do_login(request):
if user.try_login_counter > 10 and (timezone.now() - user.last_try_login_time).seconds < 600:
user.try_login_counter += 1
user.save()
context['error_msg'] = '登录失败次数太多,锁定10分钟'
context['error_msg'] = _('登录失败次数太多,锁定10分钟')
return render(request, 'login.html', context)
if user.password == hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest():
request.session['userid'] = user.id
@@ -112,7 +113,7 @@ def do_login(request):
else:
user.try_login_counter += 1
user.save()
context['error_msg'] = '用户名或密码错误'
context['error_msg'] = _('用户名或密码错误')
return render(request, 'login.html', context)
if User.objects.count() < 1:
@@ -124,15 +125,15 @@ def do_login(request):
def random_id_login(request):
c = Config.objects.filter(name='enable_create_random_user')
if c and 'no' == c[0].value:
return redirect('/login?msg=随机账号功能已关闭')
return redirect('/login?msg=' + _('随机账号功能已关闭'))
user_agent = request.META.get('HTTP_USER_AGENT').lower()
if user_agent.find('bot') > 0 or user_agent.find('spider') > 0:
return redirect('/login?msg=爬虫禁止登录')
return redirect('/login?msg=' + _('爬虫禁止登录'))
user_ip = request.META.get('HTTP_X_REAL_IP') or request.META.get('REMOTE_ADDR')
if User.objects.filter(login_ip=user_ip).count() > 20:
return redirect('/login?msg=随机账号超限,请注册登录')
return redirect('/login?msg=' + _('随机账号超限,请注册登录'))
for _ in range(30):
username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
if not User.objects.filter(username=username):
@@ -142,29 +143,29 @@ def random_id_login(request):
request.session['userid'] = user.id
request.session['username'] = username
return redirect('/dns/')
return redirect('/login?msg=随机账号创建失败')
return redirect('/login?msg=' + _('随机账号创建失败'))
def register(request):
c = Config.objects.filter(name='enable_register')
if c and 'no' == c[0].value:
return redirect('/login?msg=注册功能已关闭')
return redirect('/login?msg=' + _('注册功能已关闭'))
username = request.POST.get('username', '')[:100]
password = request.POST.get('password', '')[:100]
email = request.POST.get('email', '')[:100]
context = {'title': '注册', 'reg': 'true', 'error_msg': '',
context = {'title': _('注册'), 'reg': 'true', 'error_msg': '',
'username': username, 'password': password, 'email': email}
if User.objects.count() < 1:
context['init'] = 'true'
if request.method == 'POST':
if User.objects.filter(username=username):
context['error_msg'] = '无法创建该账号,已被占用'
context['error_msg'] = _('无法创建该账号,已被占用')
return render(request, 'login.html', context)
else:
m = re.match('[a-zA-Z0-9]+', username)
if not m or len(m.group()) != len(username):
context['error_msg'] = '用户名只能包含字母或数字'
context['error_msg'] = _('用户名只能包含字母或数字')
return render(request, 'login.html', context)
password = hashlib.md5((password + username[:3] + '@dnslog').encode('utf-8')).hexdigest()
token = hashlib.md5((password + username[:3] + '@token').encode('utf-8')).hexdigest()[:8]
@@ -175,7 +176,7 @@ def register(request):
SysUser.objects.create_user(username=username, email=email, password=password,
is_staff=1, is_superuser=1)
user.save()
return redirect('/login?msg=注册成功,请登录以确保密码有效')
return redirect('/login?msg=' + _('注册成功,请登录以确保密码有效'))
return render(request, 'login.html', context)
@@ -218,13 +219,13 @@ def dns_delete(request):
if obj:
if user.username != 'demo':
obj.delete()
return redirect(url+'&suc=删除成功')
return redirect(url+'&suc=' + _('删除成功'))
else:
if request.GET.get("domain"):
url += "&domain=" + request.GET.get("domain")
if request.GET.get("ip"):
url += "&ip=" + request.GET.get("ip")
return redirect(url+"&fail=删除失败")
return redirect(url+"&fail=" + _("删除失败"))
def web_delete(request):
@@ -249,13 +250,13 @@ def web_delete(request):
if obj:
if user.username != 'demo':
obj.delete()
return redirect(url+'&suc=删除成功')
return redirect(url+'&suc=' + _('删除成功'))
else:
if request.GET.get("domain"):
url += "&domain=" + request.GET.get("domain")
if request.GET.get("ip"):
url += "&ip=" + request.GET.get("ip")
return redirect(url+"&fail=删除失败")
return redirect(url+"&fail=" + _("删除失败"))
def web_view(request):
@@ -303,7 +304,7 @@ def log_view(request, type):
return HttpResponse('noChange')
else:
return HttpResponse('Changed')
context['title'] = 'DNSLog管理'
context['title'] = _('DNSLog管理')
context['page'] = page
context['logs'] = logs
context['numpages'] = paginator.num_pages
@@ -336,7 +337,7 @@ def log_view(request, type):
return HttpResponse('noChange')
else:
return HttpResponse('Changed')
context['title'] = 'WebLog管理'
context['title'] = _('WebLog管理')
context['page'] = page
context['logs'] = logs
context['numpages'] = paginator.num_pages
@@ -359,19 +360,19 @@ def log_view(request, type):
c = Config.objects.filter(name=c_name)
if c and 'no' == c[0].value:
context[c_name] = 'no'
context['title'] = 'API配置'
context['title'] = _('API配置')
context['last_id'] = context['total'] = context['page'] = 0
context['query_prefix'] = ''
context['host'] = request.scheme + '://' + request.get_host()
elif type == 'rebind':
context['title'] = 'DNS重绑定'
context['title'] = _('DNS重绑定')
context['last_id'] = 0
context['total'] = 0
context['page'] = 0
context['query_prefix'] = ''
context['host'] = request.scheme + '://' + request.get_host()
elif type == 'payloads':
context['title'] = 'Payloads大全'
context['title'] = _('Payloads大全')
else:
return HttpResponseRedirect('/')
context['userdomain'] = user.user_domain + '.' + settings.DNS_DOMAIN
+1
View File
@@ -6,6 +6,7 @@ body {
body {
display: -ms-flexbox;
display: flex;
flex-direction: column;
-ms-flex-align: center;
align-items: center;
padding-top: 40px;
+3 -2
View File
@@ -1,6 +1,7 @@
{% load i18n %}
<div style="margin-left: auto;">
<label><input type="checkbox" class="form-control ml-5 mr-2" id="auto_refresh" {% if monitor == 'true' %} checked {% endif %}>监视刷新</label>
<label><input type="checkbox" class="form-control ml-5 mr-2" id="auto_refresh" {% if monitor == 'true' %} checked {% endif %}>{% translate '监视刷新' %}</label>
</div>
<div class="mr-5 ml-2">
<img src="/static/help.png" width="16" height="16" data-toggle="popover" data-trigger="hover" data-title="自动刷新" data-content="监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请在搜索结果页开启"/>
<img src="/static/help.png" width="16" height="16" data-toggle="popover" data-trigger="hover" data-title="{% translate '自动刷新' %}" data-content="{% translate '监视频率为20秒,一旦发现新域名,本页面将自动刷新。如果希望监视特定关键词,请在搜索结果页开启' %}"/>
</div>
+57 -17
View File
@@ -1,4 +1,5 @@
{% load static %}
{% load i18n %}
<!doctype html>
<html lang="zh-CN">
<head>
@@ -13,33 +14,63 @@
<link href="{% static 'signin.css' %}" rel="stylesheet">
</head>
<body class="text-center">
<form action="{% url 'set_language' %}" method="post" name="langForm" style="display: none">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}">
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
{{ LANGUAGE_CODE }}
<input type="submit" value="Switch">
</form>
<form class="form-signin" method="post"{% if reg == 'true' %} oninput='password_check.setCustomValidity(password_check.value != password.value ? "两次输入的密码不一致" : "")'{% endif %}>
<img class="mb-4" src="{% static "pentester.png" %}" width="400">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="lang" id="lang_zh" value="zh-hans" {% if LANGUAGE_CODE == 'zh-hans' %}checked{% endif %}>
<label class="form-check-label" for="exampleRadios1">
简体中文
</label>
</div>
<div class="form-check form-check-inline ml-4 mb-3">
<input class="form-check-input" type="radio" name="lang" id="lang_en" value="en" {% if LANGUAGE_CODE == 'en-us' %}checked{% endif %}>
<label class="form-check-label" for="exampleRadios1">
English
</label>
</div>
<div class="alert-warning mb-2">{{ error_msg }}</div>
{% if reg == 'true' %}
<p class="alert alert-info">{% if init == 'true' %}<span style="color: red">请创建第一个账户,默认将成为管理员</span><br />{% endif %}用户名即域名前缀,越短,越有利于绕过限制</p>
<p class="alert alert-info">{% if init == 'true' %}<span style="color: red">请创建第一个账户,默认将成为管理员</span><br />{% endif %}{% translate '用户名即域名前缀,越短,越有利于绕过限制' %}</p>
<input type="text" id="username" name="username" class="form-control mt-3" placeholder="用户名" value="{{ username }}" required autofocus>
<input type="email" id="email" name="email" class="form-control" placeholder="邮箱" value="{{ email }}" style="border-radius: 0;margin-bottom: -1px;" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" minlength="6" value="{{ password }}" style="border-radius: 0;margin-bottom: -1px;" required>
<input type="password" id="password_check" name="password_check" class="form-control" placeholder="再次输入密码" required>
<input type="text" id="username" name="username" class="form-control mt-3" placeholder="{% translate '用户名' %}" value="{{ username }}" required autofocus>
<input type="email" id="email" name="email" class="form-control" placeholder="{% translate '邮箱' %}" value="{{ email }}" style="border-radius: 0;margin-bottom: -1px;" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="{% translate '密码' %}" minlength="6" value="{{ password }}" style="border-radius: 0;margin-bottom: -1px;" required>
<input type="password" id="password_check" name="password_check" class="form-control" placeholder="{% translate '再次输入密码' %}" required>
{% csrf_token %}
<button class="btn btn-lg btn-primary btn-block" type="submit">创建用户</button>
<div class="mt-4"><a href="/login">已有账号?登录</a></div>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate '创建用户' %}</button>
<div class="mt-4"><a href="/login">{% translate '已有账号?登录' %}</a></div>
{% else %}
<input type="text" id="username" name="username" class="form-control" placeholder="用户名" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" minlength="6" required>
<input type="text" id="username" name="username" class="form-control" placeholder="{% translate '用户名' %}" required autofocus>
<input type="password" id="password" name="password" class="form-control" placeholder="{% translate '密码' %}" minlength="6" required>
{% csrf_token %}
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate '登录' %}</button>
<div class="mt-4">
{% if enable_register == 'yes' %}<a href="/register">注册新账号</a> {% endif %}
{% if enable_register == 'yes' %}<a href="/register">{% translate '注册新账号' %}</a> {% endif %}
{% if enable_create_random_user == 'yes' %}
<a href="#" class="ml-5" onclick="gen_random_id(event, false)">创建随机ID并登录</a>
<a href="#" class="ml-5" onclick="gen_random_id(event, false)">{% translate '创建随机ID并登录' %}</a>
{% endif %}</div>
{% endif %}
<div class="alert alert-info mt-5" role="alert">
基于<a href="https://github.com/bugscanteam/dnslog/" class="alert-link" target="_blank">bugscan dnslog</a>开发<br/>
{% blocktranslate %}基于<a href="https://github.com/bugscanteam/dnslog/" class="alert-link" target="_blank">bugscan dnslog</a>开发{% endblocktranslate %}<br/>
</div>
<p class="mt-5 mb-3 text-muted">&copy; 2022-2022 <a href="https://github.com/lijiejie/eyes.sh" target="_blank">LiJieJie</a><br />DNSLog / HTTPLog tool for pentesters</p>
</form>
@@ -48,18 +79,19 @@
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">提示</h5>
<h5 class="modal-title" id="exampleModalLabel">{% translate '提示' %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>随机账号创建后,无法再次登录,其数据可能被定期清理 <br />
如果你希望长期保存日志,可注册个人账号</p>
<p>{% translate '随机账号创建后,无法再次登录,其数据可能被定期清理' %} <br />
{% translate '如果你希望长期保存日志,可注册个人账号' %}</p>
</div>
<div class="modal-footer">
<a class="button btn-sm btn-primary" style="padding-top: 7px;" href="#"
onclick="gen_random_id(event, true)">确认创建</a>
onclick="gen_random_id(event, true)">{% translate '确认创建' %}</a>
</div>
</div>
</div>
</div>
@@ -74,6 +106,14 @@
}
$('#confirmModal').modal();
}
$('.form-check-input').change(function (e){
if (e.target.id === 'lang_zh'){
$("[name='language']").val('zh-hans');
} else {
$("[name='language']").val('en');
}
$("[name='langForm']").submit();
})
</script>
</body>
</html>
+3 -2
View File
@@ -1,3 +1,4 @@
{% load i18n %}
<nav>
<ul class="pagination">
@@ -30,9 +31,9 @@
<li class="page-item disabled"><span class="page-link" aria-hidden="true">&raquo;</span></li>
{% endif %}
<span class="page-link ml-4" style="border: none">第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录</span>
<span class="page-link ml-4" style="border: none">{% blocktranslate %}第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录{% endblocktranslate %}</span>
<a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}"
onclick="delete_all(event, false)">删除所有记录</a>
onclick="delete_all(event, false)">{% translate '删除所有记录' %}</a>
</ul>
</nav>
+46 -45
View File
@@ -1,4 +1,5 @@
{% load static %}
{% load i18n %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
@@ -45,7 +46,7 @@
<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
</svg>
{{ username }}</span>
<a href="/logout/">退出</a>
<a href="/logout/">{% translate '退出' %}</a>
</ul>
</nav>
{% if fail %}<div class="alert alert-danger">{{ fail }}</div>{% endif %}
@@ -53,9 +54,9 @@
{% if type == 'dns'%}
<form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between">
<div>
<input class="form-control mr-sm-2 input-sm" size="30" type="text" placeholder="域名" name="domain" value="{{ domain }}">
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">搜索</button>
<span class="ml-5">子域名: <mark>{{userdomain}}</mark></span>
<input class="form-control mr-sm-2 input-sm" size="30" type="text" placeholder="{% translate '域名' %}" name="domain" value="{{ domain }}">
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">{% translate '搜索' %}</button>
<span class="ml-5">{% translate '子域名' %}: <mark>{{userdomain}}</mark></span>
</div>
{% include 'auto_reload.html' %}
</form>
@@ -65,12 +66,12 @@
<thead>
<tr>
<th>ID</th>
<th>域名</th>
<th>{% translate '域名' %}</th>
<th>Type</th>
<th>IP</th>
<th>位置</th>
<th>时间</th>
<th style="width: 100px;">操作</th>
<th>{% translate '位置' %}</th>
<th>{% translate '时间' %}</th>
<th style="width: 120px;">{% translate '操作' %}</th>
</tr>
</thead>
<tbody>
@@ -83,7 +84,7 @@
<td>{% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %}</td>
<td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td>
<td>
<a class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">删除</a>
<a class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">{% translate '删除' %}</a>
</td>
</tr>
{% endfor %}
@@ -101,7 +102,7 @@
</select>
<input class="form-control mr-sm-2 input-sm {% if headers != '' and path == '' %}d-none{% endif %}" size="30" type="text" placeholder="URL" name="path" id="inputURL" value="{{ path }}">
<input class="form-control mr-sm-2 input-sm {% if path != '' or headers == '' %}d-none{% endif %}" size="30" type="text" placeholder="headers" name="headers" id="inputHeaders" value="{{ headers }}">
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">搜索</button>
<button class="btn btn-sm btn-primary my-2 my-sm-0" type="submit">{% translate '搜索' %}</button>
</div>
{% include 'auto_reload.html' %}
</form>
@@ -112,9 +113,9 @@
<th>ID</th>
<th style="width: 350px;">URL</th>
<th>IP</th>
<th>位置</th>
<th>时间</th>
<th style="width: 150px;">操作</th>
<th>{% translate '位置' %}</th>
<th>{% translate '时间' %}</th>
<th style="width: 170px;">{% translate '操作' %}</th>
</tr>
</thead>
<tbody>
@@ -126,8 +127,8 @@
<td> {% if log.city %} {{ log.city }} {% else %} &nbsp; {% endif %} </td>
<td>{{ log.created_time|date:'Y-m-d H:i:s' }}</td>
<td style="width: 150px;">
<a type="button" class="button btn-sm btn-primary" onclick="show_web_headers({{log.id}})" id="showButton_{{log.id}}">查看</a>
<a type="button" class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">删除</a>
<a type="button" class="button btn-sm btn-primary" onclick="show_web_headers({{log.id}})" id="showButton_{{log.id}}">{% translate '查看' %}</a>
<a type="button" class="button btn-sm btn-danger" href="delete?{{ query_prefix }}id={{ log.id }}{% if page != 1 %}&page={{ page }}{% endif %}">{% translate '删除' %}</a>
</td>
</tr>
<tr class="d-none" id="web_headers_{{log.id}}">
@@ -150,11 +151,11 @@
<div class="card" >
<div class="card-body">
<p class="card-text">
<b>子域名:</b> <mark>{{userdomain}}</mark>
<b>{% translate '子域名' %}:</b> <mark>{{userdomain}}</mark>
<b class="ml-4">Token:</b> <mark>{{token}}</mark>
{% if is_admin %}
<b class="ml-4 config"><input type="checkbox" id="enable_register" {% if enable_register == 'yes' %}checked{% endif %}> 开启用户注册功能</b>
<b class="ml-4 config"><input type="checkbox" id="enable_create_random_user" {% if enable_create_random_user == 'yes' %}checked{% endif %}> 开启产生随机账号</b>
<b class="ml-4 config"><input type="checkbox" id="enable_register" {% if enable_register == 'yes' %}checked{% endif %}> {% translate '开启用户注册功能' %}</b>
<b class="ml-4 config"><input type="checkbox" id="enable_create_random_user" {% if enable_create_random_user == 'yes' %}checked{% endif %}> {% translate '开启产生随机账号' %}</b>
{% endif %}
</p>
@@ -163,46 +164,46 @@
<div class="card mt-2">
<div class="card-header">
单个请求命中查询
{% translate '单个请求命中查询' %}
</div>
<div class="card-body">
<p class="card-text">
{{host}}/api/{type}/{{username}}/{prefix}/?token={{ token }}</p>
</p>
<ul>
<li>type: 设置为 <mark>dns</mark> 或者 <mark>web</mark></li>
<li>prefix: 三级域名前缀</li>
<li>type: {% translate '设置为' %} <mark>dns</mark> {% translate '或者' %} <mark>web</mark></li>
<li>prefix: {% translate '三级域名前缀' %}</li>
</ul>
<p>检查是否触发 <mark>test.{{userdomain}}</mark>访问<a href="{{host}}/api/dns/{{username}}/test/?token={{ token }}" target="_blank">{{host}}/api/dns/{{username}}/test/?token={{ token }}</a></p>
<p>{% translate '检查是否触发' %} <mark>test.{{userdomain}}</mark>{% translate '访问' %}<a href="{{host}}/api/dns/{{username}}/test/?token={{ token }}" target="_blank">{{host}}/api/dns/{{username}}/test/?token={{ token }}</a></p>
<ul>
<li>返回 <mark>True</mark>,请求被触发</li>
<li>返回 <mark>False</mark>,请求未触发</li>
<li>{% translate '返回' %} <mark>True</mark>{% translate '请求被触发' %}</li>
<li>{% translate '返回' %} <mark>False</mark>{% translate '请求未触发' %}</li>
</ul>
</div>
</div>
<div class="card mt-2">
<div class="card-header">
多个请求命中查询
{% translate '多个请求命中查询' %}
</div>
<div class="card-body">
<p class="card-text">
{{host}}/api/group/dns/{{username}}/{prefix}/?token={{ token }}</p>
</p>
<ul>
<li>prefix: 三级域名前缀</li>
<li>prefix: {% translate '三级域名前缀' %}</li>
</ul>
<p>对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。</p>
<p>{% translate '对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。' %}</p>
<ul>
<li>扫描器投递 <mark>payload1</mark>使用域名<mark>payload1.xxx-rce.{{userdomain}}</mark></li>
<li>扫描器投递 <mark>payload2</mark>使用域名<mark>payload2.xxx-rce.{{userdomain}}</mark></li>
<li>扫描器投递 <mark>payload3</mark>使用域名<mark>payload3.xxx-rce.{{userdomain}}</mark></li>
<li>{% translate '扫描器投递' %} <mark>payload1</mark>{% translate '使用域名' %}<mark>payload1.xxx-rce.{{userdomain}}</mark></li>
<li>{% translate '扫描器投递' %} <mark>payload2</mark>{% translate '使用域名' %}<mark>payload2.xxx-rce.{{userdomain}}</mark></li>
<li>{% translate '扫描器投递' %} <mark>payload3</mark>{% translate '使用域名' %}<mark>payload3.xxx-rce.{{userdomain}}</mark></li>
<li>...</li>
</ul>
<p>检查是否存在漏洞,访问:<a href="{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}" target="_blank">{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}</a></p>
<p>{% translate '检查是否存在漏洞,访问' %}<a href="{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}" target="_blank">{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}</a></p>
<ul>
<li>返回 <mark>False</mark>,漏洞未触发</li>
<li>返回 <mark>{"success": "true", "data": ["payload3", "payload2", "payload1"]}</mark>,漏洞被触发,data字段包含成功触发的payload清单,至多返回50个</li>
<li>{% translate '返回' %} <mark>False</mark>{% translate '漏洞未触发' %}</li>
<li>{% translate '返回' %} <mark>{"success": "true", "data": ["payload3", "payload2", "payload1"]}</mark>{% translate ',漏洞被触发,data字段包含成功触发的payload清单,至多返回50个' %}</li>
</ul>
</div>
</div>
@@ -217,21 +218,21 @@
<div class="card-body">
<div class="card">
<div class="card-header">
生成域名
{% translate '生成域名' %}
</div>
<div class="card-body">
<p class="card-text">
<form class="form-inline my-2 mt-md-0 input-group-sm" style="display: flex;justify-content: space-between">
<div>
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="合法IP" id="valid_ip" value="123.123.123.123">
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="非法IP" id="invalid_ip" value="10.1.1.1">
<button class="btn btn-primary my-2 my-sm-0" type="button" onclick="generate_domain(event)">生成域名</button>
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="{% translate '合法IP' %}" id="valid_ip" value="123.123.123.123">
<input class="form-control mr-sm-2 input-sm" size="20" type="text" placeholder="{% translate '非法IP' %}" id="invalid_ip" value="10.1.1.1">
<button class="btn btn-primary my-2 my-sm-0" type="button" onclick="generate_domain(event)">{% translate '生成域名' %}</button>
</div>
</form>
<div class="mt-4" id="result" style="color: red"></div>
<div class="mt-4"><a href="/dns/?domain=.r.{{ userdomain }}&monitor=true" target="_blank" class="mr-4">DNS监控</a>
<a href="/web/?path=.r.{{ userdomain }}&monitor=true" target="_blank">HTTP监控</a></div>
<div class="mt-4"><a href="/dns/?domain=.r.{{ userdomain }}&monitor=true" target="_blank" class="mr-4">{% translate 'DNS监控' %}</a>
<a href="/web/?path=.r.{{ userdomain }}&monitor=true" target="_blank">{% translate 'HTTP监控' %}</a></div>
</p>
</div>
@@ -369,18 +370,18 @@
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">提示</h5>
<h5 class="modal-title" id="exampleModalLabel">{% translate '提示' %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
是否清空全部 <b>{{ total }}</b> 条记录?删除后数据无法恢复
{% blocktranslate %} 是否清空全部 <b>{{ total }}</b> 条记录?删除后数据无法恢复' {% endblocktranslate %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">{% translate '关闭' %}</button>
<a class="button btn-sm btn-danger" style="padding-top: 7px;" href="delete?{{ query_prefix }}{% if page != 1 %}&page={{ page }}{% endif %}"
onclick="delete_all(event, true)">删除</a>
onclick="delete_all(event, true)">{% translate '删除' %}</a>
</div>
</div>
</div>
@@ -394,10 +395,10 @@
function show_web_headers(id) {
if ( $('#web_headers_' + id)[0].className == 'd-none'){
$('#web_headers_' + id).removeClass('d-none');
$('#showButton_' + id).text('收起');
$('#showButton_' + id).text('{% translate '收起' %}');
} else {
$('#web_headers_' + id).addClass('d-none');
$('#showButton_' + id).text('查看');
$('#showButton_' + id).text('{% translate '查看' %}');
}
}
/* var getUrlParameter = function getUrlParameter(sParam) {