@@ -72,14 +72,31 @@ const createEvaluation = async (body: ICommonObject, baseURL: string, orgId: str
7272 const row = appServer . AppDataSource . getRepository ( Evaluation ) . create ( newEval )
7373 row . average_metrics = JSON . stringify ( { } )
7474
75+ // Parse and validate evaluator arrays to prevent DoS attacks
76+ const chatflowTypes = body . chatflowType ? JSON . parse ( body . chatflowType ) : [ ]
77+ if ( ! Array . isArray ( chatflowTypes ) ) {
78+ throw new Error ( 'chatflowType must be a valid array' )
79+ }
80+
81+ const simpleEvaluators = body . selectedSimpleEvaluators . length > 0 ? JSON . parse ( body . selectedSimpleEvaluators ) : [ ]
82+ if ( ! Array . isArray ( simpleEvaluators ) ) {
83+ throw new Error ( 'selectedSimpleEvaluators must be a valid array' )
84+ }
85+
7586 const additionalConfig : ICommonObject = {
76- chatflowTypes : body . chatflowType ? JSON . parse ( body . chatflowType ) : [ ] ,
87+ chatflowTypes : chatflowTypes ,
7788 datasetAsOneConversation : body . datasetAsOneConversation ,
78- simpleEvaluators : body . selectedSimpleEvaluators . length > 0 ? JSON . parse ( body . selectedSimpleEvaluators ) : [ ]
89+ simpleEvaluators : simpleEvaluators
7990 }
8091
8192 if ( body . evaluationType === 'llm' ) {
82- additionalConfig . lLMEvaluators = body . selectedLLMEvaluators . length > 0 ? JSON . parse ( body . selectedLLMEvaluators ) : [ ]
93+ const lLMEvaluators = body . selectedLLMEvaluators . length > 0 ? JSON . parse ( body . selectedLLMEvaluators ) : [ ]
94+
95+ if ( ! Array . isArray ( lLMEvaluators ) ) {
96+ throw new Error ( 'selectedLLMEvaluators must be a valid array' )
97+ }
98+
99+ additionalConfig . lLMEvaluators = lLMEvaluators
83100 additionalConfig . llmConfig = {
84101 credentialId : body . credentialId ,
85102 llm : body . llm ,
@@ -123,6 +140,12 @@ const createEvaluation = async (body: ICommonObject, baseURL: string, orgId: str
123140 // When chatflow has an APIKey
124141 const apiKeys : { chatflowId : string ; apiKey : string } [ ] = [ ]
125142 const chatflowIds = JSON . parse ( body . chatflowId )
143+
144+ // Validate chatflowIds is an actual array to prevent DoS attacks
145+ if ( ! Array . isArray ( chatflowIds ) ) {
146+ throw new Error ( 'chatflowId must be a valid array' )
147+ }
148+
126149 for ( let i = 0 ; i < chatflowIds . length ; i ++ ) {
127150 const chatflowId = chatflowIds [ i ]
128151 const cFlow = await appServer . AppDataSource . getRepository ( ChatFlow ) . findOneBy ( {
@@ -246,7 +269,7 @@ const createEvaluation = async (body: ICommonObject, baseURL: string, orgId: str
246269 metricsArray ,
247270 actualOutputArray ,
248271 errorArray ,
249- body . selectedSimpleEvaluators . length > 0 ? JSON . parse ( body . selectedSimpleEvaluators ) : [ ] ,
272+ additionalConfig . simpleEvaluators ,
250273 workspaceId
251274 )
252275
@@ -257,7 +280,7 @@ const createEvaluation = async (body: ICommonObject, baseURL: string, orgId: str
257280
258281 if ( body . evaluationType === 'llm' ) {
259282 resultRow . llmConfig = additionalConfig . llmConfig
260- resultRow . LLMEvaluators = body . selectedLLMEvaluators . length > 0 ? JSON . parse ( body . selectedLLMEvaluators ) : [ ]
283+ resultRow . LLMEvaluators = additionalConfig . lLMEvaluators
261284 const llmEvaluatorMap : { evaluatorId : string ; evaluator : any } [ ] = [ ]
262285 for ( let i = 0 ; i < resultRow . LLMEvaluators . length ; i ++ ) {
263286 const evaluatorId = resultRow . LLMEvaluators [ i ]
0 commit comments