@@ -46,6 +46,7 @@ const RES_CODE = {
4646 AKISMET_ERROR : 1030 ,
4747 UPLOAD_FAILED : 1040
4848}
49+ const MAX_REQUEST_TIMES = parseInt ( process . env . TWIKOO_THROTTLE ) || 250
4950
5051// 全局变量 / variables
5152let db = null
@@ -54,15 +55,18 @@ let transporter
5455let request
5556let response
5657let accessToken
58+ const requestTimes = { }
5759
5860module . exports = async ( requestArg , responseArg ) => {
5961 request = requestArg
6062 response = responseArg
6163 const event = request . body || { }
64+ console . log ( '请求IP:' , request . headers [ 'x-real-ip' ] )
6265 console . log ( '请求方法:' , event . event )
6366 console . log ( '请求参数:' , event )
6467 let res = { }
6568 try {
69+ protect ( )
6670 anonymousSignIn ( )
6771 await connectToDatabase ( process . env . MONGODB_URI )
6872 await readConfig ( )
@@ -1174,6 +1178,12 @@ async function limitFilter () {
11741178
11751179// 预垃圾评论检测
11761180function preCheckSpam ( comment ) {
1181+ // 长度限制
1182+ let limitLength = parseInt ( config . LIMIT_LENGTH )
1183+ if ( Number . isNaN ( limitLength ) ) limitLength = 500
1184+ if ( limitLength && comment . length > limitLength ) {
1185+ throw new Error ( '评论内容过长' )
1186+ }
11771187 if ( config . AKISMET_KEY === 'MANUAL_REVIEW' ) {
11781188 // 人工审核
11791189 console . log ( '已使用人工审核模式,评论审核后才会发表~' )
@@ -1504,7 +1514,8 @@ async function getConfig () {
15041514 REQUIRED_FIELDS : config . REQUIRED_FIELDS ,
15051515 HIDE_ADMIN_CRYPT : config . HIDE_ADMIN_CRYPT ,
15061516 HIGHLIGHT : config . HIGHLIGHT || 'true' ,
1507- HIGHLIGHT_THEME : config . HIGHLIGHT_THEME
1517+ HIGHLIGHT_THEME : config . HIGHLIGHT_THEME ,
1518+ LIMIT_LENGTH : config . LIMIT_LENGTH
15081519 }
15091520 }
15101521}
@@ -1541,6 +1552,18 @@ async function setConfig (event) {
15411552 }
15421553}
15431554
1555+ function protect ( ) {
1556+ // 防御
1557+ const ip = request . headers [ 'x-real-ip' ]
1558+ requestTimes [ ip ] = ( requestTimes [ ip ] || 0 ) + 1
1559+ if ( requestTimes [ ip ] > MAX_REQUEST_TIMES ) {
1560+ console . log ( `${ ip } 当前请求次数为 ${ requestTimes [ ip ] } ,已超过最大请求次数` )
1561+ throw new Error ( 'Too Many Requests' )
1562+ } else {
1563+ console . log ( `${ ip } 当前请求次数为 ${ requestTimes [ ip ] } ` )
1564+ }
1565+ }
1566+
15441567// 读取配置
15451568async function readConfig ( ) {
15461569 try {
0 commit comments