@@ -804,25 +804,43 @@ int Transaction::processRequestBody() {
804
804
*/
805
805
std::unique_ptr<std::string> a = m_variableRequestHeaders.resolveFirst (
806
806
" Content-Type" );
807
+
808
+ bool requestBodyNoFilesLimitExceeded = false ;
809
+ if ((m_requestBodyType == WWWFormUrlEncoded) ||
810
+ (m_requestBodyProcessor == JSONRequestBody) ||
811
+ (m_requestBodyProcessor == XMLRequestBody)) {
812
+ if ((m_rules->m_requestBodyNoFilesLimit .m_set )
813
+ && (m_requestBody.str ().size () > m_rules->m_requestBodyNoFilesLimit .m_value )) {
814
+ m_variableReqbodyError.set (" 1" , 0 );
815
+ m_variableReqbodyErrorMsg.set (" Request body excluding files is bigger than the maximum expected." , 0 );
816
+ m_variableInboundDataError.set (" 1" , m_variableOffset);
817
+ ms_dbg (5 , " Request body excluding files is bigger than the maximum expected." );
818
+ requestBodyNoFilesLimitExceeded = true ;
819
+ }
820
+ }
821
+
807
822
#ifdef WITH_LIBXML2
808
823
if (m_requestBodyProcessor == XMLRequestBody) {
809
- std::string error;
810
- if (m_xml->init () == true ) {
811
- m_xml->processChunk (m_requestBody.str ().c_str (),
812
- m_requestBody.str ().size (),
813
- &error);
814
- m_xml->complete (&error);
815
- }
816
- if (error.empty () == false ) {
817
- m_variableReqbodyError.set (" 1" , m_variableOffset);
818
- m_variableReqbodyErrorMsg.set (" XML parsing error: " + error,
819
- m_variableOffset);
820
- m_variableReqbodyProcessorErrorMsg.set (" XML parsing error: " \
821
- + error, m_variableOffset);
822
- m_variableReqbodyProcessorError.set (" 1" , m_variableOffset);
823
- } else {
824
- m_variableReqbodyError.set (" 0" , m_variableOffset);
825
- m_variableReqbodyProcessorError.set (" 0" , m_variableOffset);
824
+ // large size might cause issues in the parsing itself; omit if exceeded
825
+ if (!requestBodyNoFilesLimitExceeded) {
826
+ std::string error;
827
+ if (m_xml->init () == true ) {
828
+ m_xml->processChunk (m_requestBody.str ().c_str (),
829
+ m_requestBody.str ().size (),
830
+ &error);
831
+ m_xml->complete (&error);
832
+ }
833
+ if (error.empty () == false ) {
834
+ m_variableReqbodyError.set (" 1" , m_variableOffset);
835
+ m_variableReqbodyErrorMsg.set (" XML parsing error: " + error,
836
+ m_variableOffset);
837
+ m_variableReqbodyProcessorErrorMsg.set (" XML parsing error: " \
838
+ + error, m_variableOffset);
839
+ m_variableReqbodyProcessorError.set (" 1" , m_variableOffset);
840
+ } else {
841
+ m_variableReqbodyError.set (" 0" , m_variableOffset);
842
+ m_variableReqbodyProcessorError.set (" 0" , m_variableOffset);
843
+ }
826
844
}
827
845
#endif
828
846
#if WITH_YAJL
@@ -831,26 +849,29 @@ int Transaction::processRequestBody() {
831
849
#else
832
850
if (m_requestBodyProcessor == JSONRequestBody) {
833
851
#endif
834
- std::string error;
835
- if (m_rules->m_requestBodyJsonDepthLimit .m_set ) {
836
- m_json->setMaxDepth (m_rules->m_requestBodyJsonDepthLimit .m_value );
837
- }
838
- if (m_json->init () == true ) {
839
- m_json->processChunk (m_requestBody.str ().c_str (),
840
- m_requestBody.str ().size (),
841
- &error);
842
- m_json->complete (&error);
843
- }
844
- if (error.empty () == false && m_requestBody.str ().size () > 0 ) {
845
- m_variableReqbodyError.set (" 1" , m_variableOffset);
846
- m_variableReqbodyProcessorError.set (" 1" , m_variableOffset);
847
- m_variableReqbodyErrorMsg.set (" JSON parsing error: " + error,
848
- m_variableOffset);
849
- m_variableReqbodyProcessorErrorMsg.set (" JSON parsing error: " \
850
- + error, m_variableOffset);
851
- } else {
852
- m_variableReqbodyError.set (" 0" , m_variableOffset);
853
- m_variableReqbodyProcessorError.set (" 0" , m_variableOffset);
852
+ // large size might cause issues in the parsing itself; omit if exceeded
853
+ if (!requestBodyNoFilesLimitExceeded) {
854
+ std::string error;
855
+ if (m_rules->m_requestBodyJsonDepthLimit .m_set ) {
856
+ m_json->setMaxDepth (m_rules->m_requestBodyJsonDepthLimit .m_value );
857
+ }
858
+ if (m_json->init () == true ) {
859
+ m_json->processChunk (m_requestBody.str ().c_str (),
860
+ m_requestBody.str ().size (),
861
+ &error);
862
+ m_json->complete (&error);
863
+ }
864
+ if (error.empty () == false && m_requestBody.str ().size () > 0 ) {
865
+ m_variableReqbodyError.set (" 1" , m_variableOffset);
866
+ m_variableReqbodyProcessorError.set (" 1" , m_variableOffset);
867
+ m_variableReqbodyErrorMsg.set (" JSON parsing error: " + error,
868
+ m_variableOffset);
869
+ m_variableReqbodyProcessorErrorMsg.set (" JSON parsing error: " \
870
+ + error, m_variableOffset);
871
+ } else {
872
+ m_variableReqbodyError.set (" 0" , m_variableOffset);
873
+ m_variableReqbodyProcessorError.set (" 0" , m_variableOffset);
874
+ }
854
875
}
855
876
#endif
856
877
#if defined(WITH_LIBXML2) or defined(WITH_YAJL)
@@ -859,11 +880,13 @@ int Transaction::processRequestBody() {
859
880
if (m_requestBodyType == MultiPartRequestBody) {
860
881
#endif
861
882
std::string error;
883
+ int reqbodyNoFilesLength = 0 ;
862
884
if (a != NULL ) {
863
885
Multipart m (*a, this );
864
886
if (m.init (&error) == true ) {
865
887
m.process (m_requestBody.str (), &error, m_variableOffset);
866
888
}
889
+ reqbodyNoFilesLength = m.m_reqbody_no_files_length ;
867
890
m.multipart_complete (&error);
868
891
}
869
892
if (error.empty () == false ) {
@@ -873,13 +896,22 @@ int Transaction::processRequestBody() {
873
896
m_variableOffset);
874
897
m_variableReqbodyProcessorErrorMsg.set (" Multipart parsing " \
875
898
" error: " + error, m_variableOffset);
899
+ } else if (((m_rules->m_requestBodyNoFilesLimit .m_set )
900
+ && (reqbodyNoFilesLength > m_rules->m_requestBodyNoFilesLimit .m_value ))) {
901
+ m_variableReqbodyError.set (" 1" , 0 );
902
+ m_variableReqbodyErrorMsg.set (" Request body excluding files is bigger than the maximum expected." , 0 );
903
+ m_variableInboundDataError.set (" 1" , m_variableOffset);
904
+ ms_dbg (5 , " Request body excluding files is bigger than the maximum expected." );
876
905
} else {
877
906
m_variableReqbodyError.set (" 0" , m_variableOffset);
878
907
m_variableReqbodyProcessorError.set (" 0" , m_variableOffset);
879
908
}
880
909
} else if (m_requestBodyType == WWWFormUrlEncoded) {
881
910
m_variableOffset++;
882
- extractArguments (" POST" , m_requestBody.str (), m_variableOffset);
911
+ // large size might cause issues in the parsing itself; omit if exceeded
912
+ if (!requestBodyNoFilesLimitExceeded) {
913
+ extractArguments (" POST" , m_requestBody.str (), m_variableOffset);
914
+ }
883
915
} else if (m_requestBodyType != UnknownFormat) {
884
916
/* *
885
917
* FIXME: double check to see if that is a valid scenario...
0 commit comments