You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
6.9 KiB

{% extends 'base.html' %}
{% block title %}ZFSAFE{% endblock %}
<!-- 页面样式块 -->
{% block style %}
#cookieInfo {
font-size: 0.9rem;
}
{% endblock %}
<!-- 页面内容块 -->
{% block content %}
<div class="container mt-4">
<!-- 测试目标输入框 -->
<div class="mb-3">
<label for="testTarget" class="form-label">
测试目标: <span class="text-danger">*</span>
</label>
<input
type="text"
class="form-control"
id="testTarget"
placeholder="输入测试目标。多目标以,(英文逗号)隔开,或导入txt文件(一行一个目标)"
required
/>
</div>
<!-- cookie 信息输入框,左缩进,非必填 -->
<div class="mb-3">
<!-- 模型选择 -->
<div style="margin-left: 20px; margin-bottom: 10px">
<label class="fw-bold" style="font-size:0.9rem">模型选择:</label>
<select class="form-select" id="modelSelect" style="font-size:0.9rem">
<option value="1">DeepSeek</option>
<option value="2">GPT-O3</option>
<option value="4">Qwen3</option>
</select>
</div>
<!-- 测试模式:全自动,半自动 -->
<div style="margin-left: 20px">
<label class="fw-bold" style="font-size:0.9rem">测试模式: </label>
<div class="form-check form-check-inline">
<input
class="form-check-input"
type="radio"
name="testMode"
id="autoMode"
value="auto"
/>
<label class="form-check-label" for="autoMode"
>自动执行</label
>
</div>
<div class="form-check form-check-inline">
<input
class="form-check-input"
type="radio"
name="testMode"
id="manualMode"
value="manual"
checked
/>
<label class="form-check-label" for="manualMode"
>人工确认</label
>
</div>
</div>
</div>
<!-- 隐藏的文件输入框 -->
<input type="file" id="fileInput" accept=".txt" style="display:none;"/>
<!-- 开始按钮,右对齐 -->
<div class="mb-3 text-end">
<button id="addfileButton" class="btn btn-primary">目标文件</button>
<button id="startButton" class="btn btn-primary">开始</button>
</div>
<!-- 使用说明 -->
<div class="mt-4">
<label for="usage" class="form-label">使用说明:</label>
<textarea class="form-control" id="usage" rows="9">
1.测试模式分为两种:自动执行和人工确认(单步模式),模式的切换只允许在暂停情况下调整;
2.暂停不停止正在执行指令,指令执行后会根据当前参数的设定执行下一步工作;
3.单步的作用是将节点中:待执行的指令进行执行,待提交LLM的数据提交LLM;
4.顶部的单步是针对整个任务的单步执行,若节点执行状态不一致,会存在某些节点执行测试指令,某些节点提交llm任务的情况,节点树区域的控制是针对该节点的控制;
5.由于LLM的不一致性,会存在无执行任务,但没有标记完成的任务节点,可作为已完成论;
6.在单步模式下,若某指令执行的结果错误,可以在查看MSG功能里,修改待提交的执行结果,来保障测试的顺利推进;
7.对于已经验证漏洞存在的节点,若LLM返回了测试指令,但没有必要继续验证的话,可以点击该节点的暂停按钮,暂停该节点的测试推进;
</textarea>
<div style="color: red; margin-top: 0.5rem;">****本工具仅限于在得到授权的前提下使用,若目标重要性很高,请使用单步模式,确认测试指令的影响后执行!
</div>
</div>
</div>
{% endblock %}
<!-- 页面脚本块 -->
{% block script %}
<script>
let curmodel = 1 //0-腾讯云,1-DS,2-2233.ai,3-GPT
// 为模型选择下拉框绑定选择事件
document.getElementById("modelSelect").addEventListener("change", function() {
const selectedModel = this.value;
console.log("选择的模型为:" + selectedModel);
// 可根据需要进一步处理选中模型
if(selectedModel === "1"){
curmodel = 1;
}else if(selectedModel === "2"){
curmodel = 2; //暂时用2233.ai接口代替o3
}else if(selectedModel === "4") {
curmodel = 4;
}else if(selectedModel === "5") {
curmodel = 5;
} else {
alert("模型参数存在问题,请联系管理员!!");
}
});
document.getElementById("startButton").addEventListener("click", async () => {
//取值
const testTarget = document.getElementById("testTarget").value;
let workType = 0; //0-人工,1-自动
const selected = document.getElementById('manualMode').checked;
if(selected){
workType = 0;
}else {
workType = 1;
}
// 测试目标不能为空
if (!testTarget) {
alert("测试目标不能为空!");
return;
}
try {
const response = await fetch("/api/task/start", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
testTarget,
workType,
curmodel,
}),
});
// 状态码校验
if (!response.ok) {
const errorData = await res.json();
throw new Error(errorData.error || `HTTP错误 ${res.status}`);
}
const data = await response.json();
fail_list = data.fail_list;
if(fail_list.trim() !== ""){
alert("创建任务成功,失败的有:"+fail_list);
}
window.location.href = "/task_manager.html";
} catch (error) {
console.error("Error:", error);
alert("请求出错,请稍后再试!");
}
});
//上传目标文件
const fileInput = document.getElementById('fileInput');
const addfileButton = document.getElementById('addfileButton');
const testTargetInput = document.getElementById('testTarget');
// 点击“目标文件”按钮时触发文件选择
addfileButton.addEventListener('click', () => {
fileInput.value = null; // 允许重复选择同一个文件
fileInput.click();
});
// 文件选中后读取内容、替换换行并填入输入框
fileInput.addEventListener('change', async (e) => {
const file = e.target.files[0];
if (!file) return;
try {
// 现代浏览器支持直接用 File.text()
const text = await file.text();
// 按行拆分、去空行、再用英文逗号拼起来
const targets = text
.split(/\r?\n/) // 按 Unix/Windows 换行拆分
.map(line => line.trim()) // 去掉每行首尾空白
.filter(line => line) // 丢掉空行
.join(',');
// 填入测试目标输入框
testTargetInput.value = targets;
} catch (err) {
console.error('读取文件失败', err);
alert('读取文件失败,请检查文件格式');
}
});
</script>
{% endblock %}