From c004584df06597aa593f8b9ed6086effcd5b1fa3 Mon Sep 17 00:00:00 2001 From: lijiejie Date: Sun, 10 Apr 2022 00:08:10 +0800 Subject: [PATCH] add english translation --- dnslog/settings.py | 9 +- dnslog/urls.py | 3 +- locale/en_us/LC_MESSAGES/django.mo | Bin 0 -> 5568 bytes locale/en_us/LC_MESSAGES/django.po | 340 +++++++++++++++++++++++++++++ logview/views.py | 43 ++-- static/signin.css | 1 + templates/auto_reload.html | 5 +- templates/login.html | 76 +++++-- templates/pager.html | 5 +- templates/views.html | 91 ++++---- 10 files changed, 483 insertions(+), 90 deletions(-) create mode 100644 locale/en_us/LC_MESSAGES/django.mo create mode 100644 locale/en_us/LC_MESSAGES/django.po diff --git a/dnslog/settings.py b/dnslog/settings.py index 583e6bd..370162a 100644 --- a/dnslog/settings.py +++ b/dnslog/settings.py @@ -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: diff --git a/dnslog/urls.py b/dnslog/urls.py index 3b7287f..f51e9ed 100644 --- a/dnslog/urls.py +++ b/dnslog/urls.py @@ -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'), ] diff --git a/locale/en_us/LC_MESSAGES/django.mo b/locale/en_us/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..96df35f1fa0190b885c7b1f571d9d73c371669a2 GIT binary patch literal 5568 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 I@!vM~AMPLFo&W#< literal 0 HcmV?d00001 diff --git a/locale/en_us/LC_MESSAGES/django.po b/locale/en_us/LC_MESSAGES/django.po new file mode 100644 index 0000000..957e622 --- /dev/null +++ b/locale/en_us/LC_MESSAGES/django.po @@ -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 , 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 \n" +"Language-Team: LANGUAGE \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 "" +"基于bugscan dnslog开发" +msgstr "" +"Based on bugscan dnslog" + +#: .\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 " 是否清空全部 %(total)s 条记录?删除后数据无法恢复' " +msgstr "" +"This will delete all %(total)s records, data can not be recovered, " +"continue?" + +#: .\templates\views.html:382 +msgid "关闭" +msgstr "Close" + +#: .\templates\views.html:398 +msgid "收起" +msgstr "Collapse" diff --git a/logview/views.py b/logview/views.py index 7f87b4d..939b192 100644 --- a/logview/views.py +++ b/logview/views.py @@ -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 diff --git a/static/signin.css b/static/signin.css index 5c707f8..ced0113 100644 --- a/static/signin.css +++ b/static/signin.css @@ -6,6 +6,7 @@ body { body { display: -ms-flexbox; display: flex; + flex-direction: column; -ms-flex-align: center; align-items: center; padding-top: 40px; diff --git a/templates/auto_reload.html b/templates/auto_reload.html index 07b3294..b2fe91a 100644 --- a/templates/auto_reload.html +++ b/templates/auto_reload.html @@ -1,6 +1,7 @@ +{% load i18n %}
- +
- +
\ No newline at end of file diff --git a/templates/login.html b/templates/login.html index 05a310a..c97fbed 100644 --- a/templates/login.html +++ b/templates/login.html @@ -1,4 +1,5 @@ {% load static %} +{% load i18n %} @@ -13,34 +14,64 @@ +
+ {% csrf_token %} + + + {{ LANGUAGE_CODE }} + +
+ @@ -48,21 +79,22 @@ + @@ -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(); + }) diff --git a/templates/pager.html b/templates/pager.html index d567702..481c39a 100644 --- a/templates/pager.html +++ b/templates/pager.html @@ -1,3 +1,4 @@ +{% load i18n %} \ No newline at end of file diff --git a/templates/views.html b/templates/views.html index 442c847..47b858d 100644 --- a/templates/views.html +++ b/templates/views.html @@ -1,4 +1,5 @@ {% load static %} +{% load i18n %} @@ -45,7 +46,7 @@ {{ username }} - 退出 + {% translate '退出' %} {% if fail %}
{{ fail }}
{% endif %} @@ -53,9 +54,9 @@ {% if type == 'dns'%}
- - - 子域名: {{userdomain}} + + + {% translate '子域名' %}: {{userdomain}}
{% include 'auto_reload.html' %}
@@ -65,12 +66,12 @@ ID - 域名 + {% translate '域名' %} Type IP - 位置 - 时间 - 操作 + {% translate '位置' %} + {% translate '时间' %} + {% translate '操作' %} @@ -83,7 +84,7 @@ {% if log.city %} {{ log.city }} {% else %}   {% endif %} {{ log.created_time|date:'Y-m-d H:i:s' }} - 删除 + {% translate '删除' %} {% endfor %} @@ -101,7 +102,7 @@ - + {% include 'auto_reload.html' %} @@ -112,9 +113,9 @@ ID URL IP - 位置 - 时间 - 操作 + {% translate '位置' %} + {% translate '时间' %} + {% translate '操作' %} @@ -126,8 +127,8 @@ {% if log.city %} {{ log.city }} {% else %}   {% endif %} {{ log.created_time|date:'Y-m-d H:i:s' }} - 查看 - 删除 + {% translate '查看' %} + {% translate '删除' %} @@ -150,11 +151,11 @@

- 子域名: {{userdomain}} + {% translate '子域名' %}: {{userdomain}} Token: {{token}} {% if is_admin %} - 开启用户注册功能 - 开启产生随机账号 + {% translate '开启用户注册功能' %} + {% translate '开启产生随机账号' %} {% endif %}

@@ -163,46 +164,46 @@
- 单个请求命中查询 + {% translate '单个请求命中查询' %}

{{host}}/api/{type}/{{username}}/{prefix}/?token={{ token }}

    -
  • type: 设置为 dns 或者 web
  • -
  • prefix: 三级域名前缀
  • +
  • type: {% translate '设置为' %} dns {% translate '或者' %} web
  • +
  • prefix: {% translate '三级域名前缀' %}
-

检查是否触发 test.{{userdomain}},访问:{{host}}/api/dns/{{username}}/test/?token={{ token }}

+

{% translate '检查是否触发' %} test.{{userdomain}},{% translate '访问' %}:{{host}}/api/dns/{{username}}/test/?token={{ token }}

    -
  • 返回 True,请求被触发
  • -
  • 返回 False,请求未触发
  • +
  • {% translate '返回' %} True,{% translate '请求被触发' %}
  • +
  • {% translate '返回' %} False,{% translate '请求未触发' %}
- 多个请求命中查询 + {% translate '多个请求命中查询' %}

{{host}}/api/group/dns/{{username}}/{prefix}/?token={{ token }}

    -
  • prefix: 三级域名前缀
  • +
  • prefix: {% translate '三级域名前缀' %}
-

对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。

+

{% translate '对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。' %}

    -
  • 扫描器投递 payload1,使用域名:payload1.xxx-rce.{{userdomain}}
  • -
  • 扫描器投递 payload2,使用域名:payload2.xxx-rce.{{userdomain}}
  • -
  • 扫描器投递 payload3,使用域名:payload3.xxx-rce.{{userdomain}}
  • +
  • {% translate '扫描器投递' %} payload1,{% translate '使用域名' %}:payload1.xxx-rce.{{userdomain}}
  • +
  • {% translate '扫描器投递' %} payload2,{% translate '使用域名' %}:payload2.xxx-rce.{{userdomain}}
  • +
  • {% translate '扫描器投递' %} payload3,{% translate '使用域名' %}:payload3.xxx-rce.{{userdomain}}
  • ...
-

检查是否存在漏洞,访问:{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}

+

{% translate '检查是否存在漏洞,访问' %}:{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}

    -
  • 返回 False,漏洞未触发
  • -
  • 返回 {"success": "true", "data": ["payload3", "payload2", "payload1"]},漏洞被触发,data字段包含成功触发的payload清单,至多返回50个
  • +
  • {% translate '返回' %} False,{% translate '漏洞未触发' %}
  • +
  • {% translate '返回' %} {"success": "true", "data": ["payload3", "payload2", "payload1"]}{% translate ',漏洞被触发,data字段包含成功触发的payload清单,至多返回50个' %}
@@ -217,21 +218,21 @@
- 生成域名 + {% translate '生成域名' %}

- - - + + +
- +

@@ -369,18 +370,18 @@ @@ -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) {