diff --git a/frontend/Web/index.js b/frontend/Web/index.js index 1a97777..a0c4fb8 100644 --- a/frontend/Web/index.js +++ b/frontend/Web/index.js @@ -2,6 +2,8 @@ const express = require('express'); const { createServer } = require('node:http'); const { join } = require('node:path'); const { Server } = require('socket.io'); +const IsValid=require('./validator.js'); +const Validing=process.env['VALIDING']; const app = express(); const server = createServer(app); @@ -46,6 +48,12 @@ async function GetResult(session_token,operation_token) { { const ret=message_map.get(session_token).get(operation_token); message_map.get(session_token).delete(operation_token); + if(Validing=='True'){ + if(!(await IsValid(ret))) + { + ret="Invalid Content"; + } + } return ret; } } @@ -124,6 +132,13 @@ io.on('connection', async (socket) => { }); socket.on('request', async (msg) => { console.log('message: ' + msg); + if(Validing=='True'){ + if(!(await IsValid(msg))) + { + socket.emit('response', "Invalid Input"); + return; + } + } const substrings = msg.trim().split('\n')[0].split(' '); const head=substrings[0]; const session_token=substrings[1]; diff --git a/frontend/Web/login.html b/frontend/Web/login.html index 5f6b18b..b4831eb 100644 --- a/frontend/Web/login.html +++ b/frontend/Web/login.html @@ -95,16 +95,13 @@ var username = document.getElementById("user_name").value; var password = document.getElementById("password").value; var ret=await Request("su "+username+" "+password); - if(ret=="Invalid") - { - alert("Invalid username or password"); - } - else + if(ret=="[empty]") { await UpdateUserInfo(); document.querySelector('.content').innerHTML = '

Login Success

Redirecting to home page in 3 seconds...

'; setTimeout(function(){window.location.href="/";},3000); } + else alert("Invalid username or password"); } diff --git a/frontend/Web/package-lock.json b/frontend/Web/package-lock.json index 272a80d..0df0dd9 100644 --- a/frontend/Web/package-lock.json +++ b/frontend/Web/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0.1", "license": "ISC", "dependencies": { + "@alicloud/pop-core": "^1.7.13", "async-lock": "^1.4.0", "async-mutex": "^0.4.0", "express": "^4.18.2", @@ -16,6 +17,34 @@ "socket.io": "^4.7.2" } }, + "node_modules/@alicloud/pop-core": { + "version": "1.7.13", + "resolved": "https://registry.npmjs.org/@alicloud/pop-core/-/pop-core-1.7.13.tgz", + "integrity": "sha512-agzr4DU+aAGW7/2mp2hP1JcNJkn/zBS0jUGQt5etIASN0MVq1tMdudVqvWbExUG0mUouo/n2VgdnjOHjswvrlA==", + "dependencies": { + "debug": "^3.1.0", + "httpx": "^2.1.2", + "json-bigint": "^1.0.0", + "kitx": "^1.2.1", + "xml2js": "^0.5.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@alicloud/pop-core/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@alicloud/pop-core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -80,6 +109,14 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -455,6 +492,36 @@ "node": ">= 0.8" } }, + "node_modules/httpx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/httpx/-/httpx-2.3.1.tgz", + "integrity": "sha512-l5rcAoKP8A9XOIlcIA87Wt9A7AX2fgOslHOF4WB5Q24y/1+aeH8b7c7NKfm+Bcf+h0u4FHNtLCriC4mAFmCYgg==", + "dependencies": { + "@types/node": "^20", + "debug": "^4.1.1" + } + }, + "node_modules/httpx/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/httpx/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -479,6 +546,19 @@ "node": ">= 0.10" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/kitx": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/kitx/-/kitx-1.3.0.tgz", + "integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -660,6 +740,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -894,6 +979,26 @@ "optional": true } } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } } } } diff --git a/frontend/Web/package.json b/frontend/Web/package.json index 17be8d2..efb0836 100644 --- a/frontend/Web/package.json +++ b/frontend/Web/package.json @@ -11,6 +11,7 @@ "license": "ISC", "type": "commonjs", "dependencies": { + "@alicloud/pop-core": "^1.7.13", "async-lock": "^1.4.0", "async-mutex": "^0.4.0", "express": "^4.18.2", diff --git a/frontend/Web/passwd.html b/frontend/Web/passwd.html index b21608c..3d8e897 100644 --- a/frontend/Web/passwd.html +++ b/frontend/Web/passwd.html @@ -104,17 +104,14 @@ var old_password = document.getElementById("old_password").value; var new_password = document.getElementById("new_password").value; var ret=await Request("passwd "+username+" "+old_password+" "+new_password); - if(ret=="Invalid") - { - alert("Invalid username or old password"); - } - else + if(ret=="[empty]") { // 删除注册框,在中间显示“注册成功”,三秒后自动跳转到首页 document.querySelector('.passwd-box').style.display = 'none'; document.querySelector('.content').innerHTML = '

Successfully changed password

Redirecting to home page in 3 seconds...

'; setTimeout(function(){window.location.href="/";},3000); } + else alert("Invalid username or old password"); } diff --git a/frontend/Web/register.html b/frontend/Web/register.html index f088bb7..8bd6bb9 100644 --- a/frontend/Web/register.html +++ b/frontend/Web/register.html @@ -98,17 +98,14 @@ var password = document.getElementById("password").value; var nick_name = document.getElementById("nickname").value; var ret=await Request("register "+username+" "+password+" "+nick_name); - if(ret=="Invalid") - { - alert("Invalid username or password"); - } - else + if(ret=="[empty]") { // 删除注册框,在中间显示“注册成功”,三秒后自动跳转到首页 document.querySelector('.register-box').style.display = 'none'; document.querySelector('.content').innerHTML = '

Register Success

Redirecting to home page in 3 seconds...

'; setTimeout(function(){window.location.href="/";},3000); } + else alert("Invalid username or password"); } diff --git a/frontend/Web/validator.js b/frontend/Web/validator.js new file mode 100644 index 0000000..c362556 --- /dev/null +++ b/frontend/Web/validator.js @@ -0,0 +1,70 @@ +const RPCClient = require("@alicloud/pop-core"); + +console.log(process.env['ALIBABA_CLOUD_ACCESS_KEY_ID']) +console.log(process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']) + + + // 注意,此处实例化的client请尽可能重复使用,避免重复建立连接,提升检测性能。 +let client = new RPCClient({ + /** +* 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。 +* 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 +* 常见获取环境变量方式: +* 获取RAM用户AccessKey ID:process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'] +* 获取RAM用户AccessKey Secret:process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] +*/ + accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], + accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], + // 接入区域和地址请根据实际情况修改 + endpoint: "https://green-cip.cn-beijing.aliyuncs.com", + apiVersion: '2022-03-02', + // 设置http代理 + // httpProxy: "http://xx.xx.xx.xx:xxxx", + // 设置https代理 + // httpsProxy: "https://username:password@xxx.xxx.xxx.xxx:9999", +}); +async function IsValid(text) { + console.log("IsValid called"); + console.log("cheching text: "+text); + // 去除text中的空格、tab、无意义特殊符号(!@#$%^&*()_+_=~`{}|[]\;':",./<>?)等。 + //text = text.replace(/\s+/g, ""); + text = text.replace(/[!@#$%^&*()_+_=~`{}|[\]\\;':",./<>?]+/g, ""); + // 再去除换行和回车 + //text = text.replace(/[\r\n]/g, ""); + console.log("after replace: "+text); + // 通过以下代码创建API请求并设置参数。 + const params = { + // 文本检测service:内容安全控制台文本增强版规则配置的serviceCode,示例:chat_detection + "Service": "chat_detection", + "ServiceParameters": JSON.stringify({ + //待检测文本内容。 + "content": text + }), + }; + + const requestOption = { + method: 'POST', + formatParams: false, + }; + let response; + try { + // 调用接口获取检测结果。 + response = await client.request('TextModeration', params, requestOption); + // 自动路由。 + if (response.Code === 500) { + // 区域切换到cn-beijing。 + client.endpoint = "https://green-cip.cn-shanghai.aliyuncs.com"; + response = await client.request('TextModeration', params, requestOption); + } + } catch (err) { + console.log(err); + } + if(response['Message']=='OK') + { + console.log(response['Data']['reason']); + return response['Data']['reason']==""; + } + return false; +} + +module.exports=IsValid; \ No newline at end of file