coldfusion - कोल्डफ्यूजन में मान्यता के प्रयासों के समूह के साथ OWASP ESAPI सत्यापनकर्ता कैसे कार्यान्वित करें?



coldfusion-9 cfml (1)

यह ईएसएपीआई के कोल्डफ्यूजन कार्यान्वयन में एक बग लग रहा है - हमारे ईएसएपीआई के लिए आपके यूनिट परीक्षण सूट में getValidInput विधि का पूरा कवरेज परीक्षण है जो प्रदर्शित करता है कि विधि विज्ञापन विज्ञापित के रूप में काम करती है।

ऊपर अपने दूसरे अद्यतन के आधार पर मुझे लगता है कि सीएफ कार्यान्वयन कोड में एक अप्रयुक्त वैरिएबल तक पहुंचा जा सकता है (शायद त्रुटि सूची इस संदर्भ में प्रारंभ नहीं की जाती है)

मैं ओडब्ल्यूएएसपी ईएसएपीआई प्रोजेक्ट के प्रोजेक्ट लीडर हूं और ईएसएपीआई में खुद को इस बिट कोड से बहुत परिचित हूं, लेकिन कोई सीएफ़ डेवलपर नहीं है और मैंने सीएफ 9 के लिए सभी कार्यान्वयन कोड नहीं देखा है।

** संपादित करें **

सत्यापन प्रक्रिया को org.owasp.esapi.ValidationErrorList में org.owasp.esapi.ValidationErrorList का उपयोग करने के लिए init() विधि को कॉल करने के लिए org.owasp.esapi.ValidationErrorList वर्ग के लिए validator विधियों को कॉल करने से पहले आवश्यक है। निम्नलिखित स्क्रिप्ट को परीक्षण स्क्रिप्ट में जोड़ें और यह काम करेगा:

<cfset ErrorList = ErrorList.init() />

प्रसंग में:

<cfset ErrorList = CreateObject("java", "org.owasp.esapi.ValidationErrorList") />
<cfset ErrorList = ErrorList.init() />
<cfset Valid.TestField = EsapiValidator.getValidInput("Test Field", form.TestField, "SafeString", 128, true, true, ErrorList) />

अब जब अमान्य इनपुट दर्ज किया गया है, त्रुटि को फेंकने के बजाय त्रुटि ErrorList चर में जोड़ा जाएगा।

https://code.i-harness.com

मैं ओडब्ल्यूएएसपी ईएसएपीआई उपयोगिताओं के साथ खेल रहा हूं जो कोल्डफ्यूजन 9 में शामिल हैं। कोल्ड फ्यूजन की अंतर्निहित एंटरप्राइज़ सुरक्षा एपीआई encoder उपयोगिताओं बहुत सीधे आगे हैं और मेरा मानना ​​है कि मैं उन्हें ठीक काम कर रहा हूं। मेरी समस्या validator उपयोगिताओं के साथ है

मैं उन्हें अकेले काम करने के लिए मिल सकता है यही है, अगर मैं validator.getValidInput() विधि को "अमान्य" डेटा के साथ बुलाता हूं तो यह एक त्रुटि फेंकता है जिसे मैं पकड़ सकता हूं। हालांकि, जब मैं बैच में validator विधि को कॉल करने की कोशिश करता हूं तो मुझे एक रिक्त पॉइंटर अपवाद मिलता है। बैच द्वारा मेरा मतलब है सत्यापन प्रयासों के समूह को निष्पादित करने का प्रयास करना। यह validator.getValidInput() विधि को एक ValidationErrorList पैरामीटर को पारित करके काम करना माना जाता है जो इसे किसी त्रुटि को फेंकने के लिए नहीं बताए बल्कि इसके बजाय सिर्फ त्रुटि सूची में त्रुटि जोड़नी चाहिए। मैं इसे इस मोड में काम करने के लिए नहीं मिल सकता। मेरा सबसे अच्छा प्रयास मुझे एक अशक्त सूचक अपवाद दे रहा है

यहां विशिष्ट त्रुटि है:

java.lang.NullPointerException

इस स्टैक ट्रेस के साथ:

java.lang.NullPointerException at 
org.owasp.esapi.reference.DefaultValidator.getValidInput(DefaultValidator.java:238) at 
sun.reflect.GeneratedMethodAccessor377.invoke(Unknown Source) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at 
java.lang.reflect.Method.invoke(Unknown Source) at 
coldfusion.runtime.StructBean.invoke(StructBean.java:536) at 
coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2393) at 
cftest2ecfm989071068.runPage(D:\Web\internet\fboc\test.cfm:19) at 
coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231) at 
coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416) at 
coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722) at 
cfApplication2ecfc1705903666$funcONREQUEST.runFunction(D:\Web\internet\fboc\Application.cfc:70) at 
coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) at 
coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) at 
coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) at 
coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) at 
coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) at 
coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220) at 
coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:491) at 
coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:337) at 
coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:88) at 
coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:280) at 
coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:356) at 
coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at 
coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at 
coldfusion.filter.PathFilter.invoke(PathFilter.java:94) at 
coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at 
coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79) at 
coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) at 
coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at 
coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at 
coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at 
coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at 
coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62) at 
coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126) at 
coldfusion.CfmServlet.service(CfmServlet.java:201) at 
coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at 
jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at 
coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) at 
coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at 
jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at 
jrun.servlet.FilterChain.service(FilterChain.java:101) at 
jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at 
jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at 
jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at 
jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at 
jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at 
jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at 
jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

यहां एक साधारण परीक्षण स्क्रिप्ट है आप देखेंगे कि मेरे पास एक लाइन की टिप्पणी है। यह पंक्ति त्रुटि सूची के बिना काम करती है, लेकिन एक त्रुटि फेंकता है (जैसा कि यह होना चाहिए)। मैं त्रुटि को फेंकने के बिना कार्य करने की विधि प्राप्त करने की कोशिश कर रहा हूं:

<cftry>
<cfsilent>
<cfparam name="form.TestField" default="" type="string" />

<cfset Esapi = CreateObject("java", "org.owasp.esapi.ESAPI") />
<cfset EsapiEncoder = Esapi.encoder() />
<cfset EsapiValidator = Esapi.validator() />

<cfset Clean = StructNew() />
<cfset Clean.Css = EsapiEncoder.encodeForCss(form.TestField) />
<cfset Clean.Html = EsapiEncoder.encodeForHtml(form.TestField) />
<cfset Clean.HtmlAttribute = EsapiEncoder.encodeForHtmlAttribute(form.TestField) />
<cfset Clean.JavaScript = EsapiEncoder.encodeForJavaScript(form.TestField) />
<cfset Clean.Url = EsapiEncoder.encodeForUrl(form.TestField) />
<cfset Clean.Xml = EsapiEncoder.encodeForXml(form.TestField) />

<cfset ErrorList = CreateObject("java", "org.owasp.esapi.ValidationErrorList") />
<cfset Valid = StructNew() />
<cfset Valid.Input = EsapiValidator.getValidInput("Test Field", form.TestField, "SafeString", 128, false, true, ErrorList) />
<!---<cfset Valid.Input = EsapiValidator.getValidInput("Test Field", form.TestField, "SafeString", 128, false, true) />--->
</cfsilent>

<!DOCTYPE HTML>
<head>
    <meta charset='UTF-8' />
    <title>ESAPI Test</title>
</head>
<body>
    <div>
        <h3>ESAPI Test</h3>
        <cfoutput>
        <form name="frmtest" id="frmtest" action="#cgi.script_name#" method="post">
            <p>Enter text to test:</p>
            <p><input type="text" name="TestField" id="TestField" size="64" maxlength="128" value="#Clean.HtmlAttribute#" /></p>
            <p><input type="submit" name="submit" id="submit" value=" Submit " /></p>
        </form>
        </cfoutput>
        <hr />
        <cfdump var="#Clean#" label="Clean Structure" />
        <hr />
        <cfdump var="#Valid#" label="Valid Structure" />
    </div>
</body>
</html>
<cfcatch type="any">
    <hr />
    <div>
        <h3>ERROR</h3>
        <cfdump var="#cfcatch#" label="Error" />
    </div>
</cfcatch>
</cftry>

जब मैं "मान्य" डेटा के साथ इस स्क्रिप्ट को चलाता हूं तो यह ठीक काम करता है (कोई त्रुटि नहीं फेंक जाती) अगर मैं "अमान्य" वर्ण दर्ज करता हूं तो मुझे शून्य सूचक आविष्कार मिलता है।

"मान्य" डेटा का उदाहरण: this is a safe string 0123456789
"अमान्य" डेटा का उदाहरण: this is a safe string 0123456789- (अंत में हाइफ़न को देखें)

यहां validator.getValidInput विधि के लिए प्रलेखन का एक लिंक है जिसे मैं लागू करने का प्रयास कर रहा हूं

यहां दस्तावेज़ीकरण के लिए एक लिंक है जो दर्शाता है कि मैं क्या लागू करने की कोशिश कर रहा हूं

इसकी कीमत क्या है, वैधता "नियम" को validation.properties में परिभाषित किया जाता है। validation.properties फाइल जो ColdFusion के साथ आता है। वह फ़ाइल {cfusion lib} निर्देशिका में स्थित है मेरे सर्वर से उस फाइल की सामग्री यहां दी गई है:

# The ESAPI validator does many security checks on input, such as canonicalization
# and whitelist validation. Note that all of these validation rules are applied *after*
# canonicalization. Double-encoded characters (even with different encodings involved,
# are never allowed.
#
# To use:
#
# First set up a pattern below. You can choose any name you want, prefixed by the word
# "Validation." For example:
#   Validation.Email=^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$
# 
# Then you can validate in your code against the pattern like this:
#     ESAPI.validator().isValidInput("User Email", input, "Email", maxLength, allowNull);
# Where maxLength and allowNull are set for you needs, respectively.
#
# But note, when you use boolean variants of validation functions, you lose critical 
# canonicalization. It is preferable to use the "get" methods (which throw exceptions) and 
# and use the returned user input which is in canonical form. Consider the following:
#  
# try {
#    someObject.setEmail(ESAPI.validator().getValidInput("User Email", input, "Email", maxLength, allowNull));
#
Validator.SafeString=^[.\\p{Alnum}\\p{Space}]{0,1024}$
Validator.Email=^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$
Validator.IPAddress=^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Validator.URL=^(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\:\\'\\/\\\\\\+=&amp;%\\$#_]*)?$
Validator.CreditCard=^(\\d{4}[- ]?){3}\\d{4}$
Validator.SSN=^(?!000)([0-6]\\d{2}|7([0-6]\\d|7[012]))([ -]?)(?!00)\\d\\d\\3(?!0000)\\d{4}$
Validator.CFContainerID=^[\\p{Alnum}_\\-\\.:]+$
Validator.GOOGLEMAPAPI=^[\\p{Alnum}_\\+=\\/\\-]+$
Validator.CFFORMSCRIPTSRC=^[^\\*\\?\"'<>|%]*$

मुझे लगता है कि विचार इस फाइल में अपने खुद के अनुप्रयोगों के लिए नियम जोड़ने के लिए है

क्या कोई भी validator.getValidInput() प्राप्त कर validator.getValidInput()बैच में सत्यापन करने के लिए विधि (वैधता प्रयासों के समूह)?


अपडेट 1

मैंने देखा है कि जब भी मैं शून्य पॉइंटर अपवाद प्राप्त करता हूं, सर्वर पर हर बार मेरे cfusion-out.log पर लिखा जा रहा है I यह मेरा मानना ​​है कि यह एक बिंदु पर काम कर रहा है, लेकिन फिर मान्यता अपवाद असाइन करने का प्रयास करते समय एक अशक्त सूचक मिलता है:

06/25 16:08:14 [jrpp-3225] WARN  [SECURITY FAILURE Anonymous:null@unknown -> /IntrusionDetector] Invalid input: context=Test Field, type(SafeString)=^[.\p{Alnum}\p{Space}]{0,1024}$, input=this is a safe string 0123456789-
org.owasp.esapi.errors.ValidationException: Test Field: Invalid input. Please conform to regex ^[.\p{Alnum}\p{Space}]{0,1024}$ with a maximum length of 128
at org.owasp.esapi.reference.validation.StringValidationRule.checkWhitelist(StringValidationRule.java:144)
at org.owasp.esapi.reference.validation.StringValidationRule.checkWhitelist(StringValidationRule.java:160)
at org.owasp.esapi.reference.validation.StringValidationRule.getValid(StringValidationRule.java:284)
at org.owasp.esapi.reference.DefaultValidator.getValidInput(DefaultValidator.java:199)
at org.owasp.esapi.reference.DefaultValidator.getValidInput(DefaultValidator.java:236)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at coldfusion.runtime.StructBean.invoke(StructBean.java:508)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2393)
at cftest2ecfm989071068.runPage(D:\Web\internet\fboc\test.cfm:19)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722)
at cfApplication2ecfc1705903666$funcONREQUEST.runFunction(D:\Web\internet\fboc\Application.cfc:70)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)
at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405)
at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368)
at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55)
at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:491)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:337)
at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:88)
at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:280)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:356)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:94)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126)
at coldfusion.CfmServlet.service(CfmServlet.java:201)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)


अपडेट 2

मैं कोल्डफ्यूजन के लिए ओमूएएसपी ईएसएपीआई विधियों के डेमन मिलर के कार्यान्वयन के माध्यम से खुदाई कर रहा हूं। मैंने अपने कोड में देखा कि वह getValidInput() विधि को ValidationErrorList getValidInput() विशेषता के साथ कॉल नहीं करता है बल्कि उसने उत्पन्न त्रुटि को पकड़ने के लिए कोड लिखा था और फिर त्रुटि को सूची में स्वयं जोड़ दिया हममम? मैंने सोचा था कि विधि आपके लिए यह करना था ????

एक तरफ, मैं एक ऐसी लाइब्रेरी का उपयोग न करने की कोशिश कर रहा हूं जैसे कि अतिरिक्त ब्लोट से बचने के लिए जिसकी मुझे आवश्यकता नहीं है।

अपने कोड से उद्धरण:

if(structKeyExists( arguments, "errorList" )) {
        try {
            return getValidInput( arguments.context, arguments.input, arguments.type, arguments.maxLength, arguments.allowNull );
        }
        catch(esapi4cf.org.owasp.esapi.errors.ValidationException e) {
            arguments.errorList.addError( arguments.context, e );
        }
        return arguments.input;
    }
    else {
    ...