1

クロスサイト スクリプティング (XSS) から保護するために、OWASP が推奨するESAPI (Enterprise Security API)を使用しています。 esapi.jar ファイルは以前のバージョンの ColdFusion に含まれていましたが、CF10では、 encodeForJavascript()encodeForHTML()encodeForURL()encodeForCSS()、およびencodeForHTMLAttribute().

で問題が発生しencodeForJavascript()ています。バックスラッシュが失われています...

<cfoutput>
    <cfif isDefined("url.name")>
        <!--- Here is the problem, this is identical to the original ascii32to126 string except for one char is missing, the backslash between the brackets ...Z[]... --->
        #url.name#
        <cfabort>
    </cfif>

    <!---
    ASCII 32 thru 126
    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
    In the line below I double up on the double-quotes and pounds in order to get the cfset to work
    --->
    <cfset ascii32to126 = "!""##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">

    <script>
        function locateTo(value)
        {
            window.location='thisPage.cfm?name='+encodeURIComponent(value);
            //alert('thisPage.cfm?name='+encodeURIComponent(value));
        }
        locateTo('#encodeForJavaScript(ascii32to126)#');
    </script>
</cfoutput>

encodeForJavaScript()JavaScript コンテキストにいるため、最初に呼び出します。

encodeURIComponent()次に、URL が適切に構築されていることを確認するために呼び出します。

すべて正常に動作しますが、結果のページでバックスラッシュが失われました\。ここで何が欠けていますか?

(はい、出力する場所も保護する必要があることは承知しています#url.name#。この実験では、ソースを表示して文字列が元の文字列と一致するかどうかを確認する必要があったため、保護しませんでした。)

**更新** - 最新のパッチがすべて適用された ColdFusion 10 を実行しています。に問題があるようですencodeForJavaScript()

も失敗しJSStringFormat()ます。これを行うと、バックスラッシュが両方にないことがわかります...

<cfset ascii32to126 = "!""##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">
<cfoutput>
    #encodeForHTML(encodeForJavaScript(ascii32to126))#
    <br><br>
    #encodeForHTML(JSStringFormat(ascii32to126))#
</cfoutput>
4

3 に答える 3

1

FWIW、私たちは 1 年以上にわたってすべての encodeForX 関数を使用してきましたが、開発者が間違ったコンテキストを使用した場合にのみ問題が発生します。ビルドは終日実行されるため、HTMLEditFormat の使用を厳密に禁止し、Jenkins サーバーに (他の禁止されている関数とタグの中でも) チェックを行わせています。

JavaScript 用に文字列をエンコードしてから、URL 用にエンコードしています。最初に URL をエンコードしてから、JavaScript をエンコードする必要があると思います。出力をエンコードされていない文字列と比較すると、失われた文字はないようです。


<cfoutput>
    <cfif isDefined("url.name")>
        <!--- Here is the problem, this is identical to the original ascii32to126 string except for one char is missing, the backslash between the brackets ...Z[]... --->
        #url.name#
        <cfabort>
    </cfif>

    <!---
    ASCII 32 thru 126
    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
    In the line below I double up on the double-quotes and pounds in order to get the cfset to work
    --->
    <!--- Using Chr() to bypass character escaping. --->
    <cfset ascii32to126 = "!#chr(34)##chr(35)#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">
    <cfdump var="#ascii32to126#" />

    <script>
        function locateTo(a, b) {
            console.log(a); // 1. JavaScript Encoded.
            console.log(b); // 2. URL encoded, then JavaScript encoded.
            console.log(decodeURIComponent(b));// 3. Matches JavaScript encoded.
            console.log( 'thisPage.cfm?name=' + b ); // 4. Correct string.
        }

        locateTo('#encodeForJavaScript(ascii32to126)#', '#encodeForJavaScript(encodeForURL(ascii32to126))#');
    </script>
</cfoutput>

コンソール出力


!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

%21%22%23%24%25%26%27%28%29*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E 

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

thisPage.cfm?name=%21%22%23%24%25%26%27%28%29*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E 
于 2014-04-30T22:12:45.250 に答える
0

ddj() と呼ばれる独自のカスタム エンコーディング関数があります...

<!---
Author: @Brian McGinity
custom version of jsStringFormat/encodeForJavaScript
--->
<cffunction name="ddj" returntype="string" output="false">
    <cfargument name="temp" required="yes" type="string">
    <!---
    <cfset var z = jsStringFormat(arguments.temp)>
    <cfreturn z>
    --->
    <cfset var buf = CreateObject("java", "java.lang.StringBuffer")>
    <cfset var len = Len(arguments.temp)>
    <cfset var char = "">
    <cfset var charcode = 0>
    <cfset var bad   = ' >%}\~];?@&<##{|^[`/:=$+"' & "'">
    <cfset buf.ensureCapacity(JavaCast("int", len+40))>
    <cfif NOT len><cfreturn arguments.temp></cfif>

    <cfloop from="1" to="#len#" index="xmlIdx">
        <cfset char = mid(arguments.temp,xmlIdx,1)>
        <cfset charcode = asc(char)>
        <cfif charcode LT 32 or charcode gt 126>
            <cfset buf.append(JavaCast("string", ""))>
        <cfelse>
            <cfif find(char, bad) gt 0>
                <cfset buf.append(JavaCast("string",  "\u00" & right("0" & formatBaseN(charcode,16),2) ))>
            <cfelse>
                <cfset buf.append(JavaCast("string", char))>
            </cfif>
        </cfif>
    </cfloop>
    <cfreturn buf.toString()>
</cffunction>

を使用するddj()と、ascii32to126 文字列を関数に渡し、そのencodeURIComponent上で実行し、ページを見つけて印刷すると、文字列はまったく同じになります。うまくいくようです。しかし、このようにすると、最初に JS をエンコードし、次に URL をエンコードします。それは正しくないようです。私はいつも、それは逆でなければならないと考えてきました(ここを参照)。ということで、割り切らないか検討中です。これがうまくいくように見えるテストケースです...

<cfoutput>
    <cfif isDefined("url.name")>
        #url.name#
        <cfabort>
    </cfif>

    <!--- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ --->
    <cfset ascii32to126 = "!""##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">

    <script>
        function goToUrl(value)
        {
            window.location='thisPage.cfm?name='+encodeURIComponent(value);
            //alert('thisPage.cfm?name='+encodeURIComponent(value));
        }
        goToUrl('#ddj(ascii32to126)#');
    </script>
</cfoutput>
于 2014-04-30T23:19:58.807 に答える
0

(2年以上後)AdobeまたはESAPIの人々によって修正されたようです。バックスラッシュを含むすべての文字が保持されます。現在、これらのバージョンを実行しています...

サーバー製品: ColdFusion

バージョン: 11,0,09,299201

トムキャットのバージョン: 7.0.68.0

エディション: 開発者

オペレーティング システム: Windows 10

OS バージョン: 10.0

更新レベル: C:/ColdFusion11/cfusion/lib/updates/chf11000009.jar

Adobe ドライバー: 5.1.3 (ビルド 000094)

Java バージョン: 1.8.0_91

Java ベンダー: Oracle Corporation

于 2016-07-27T18:55:08.287 に答える