programing

를 부호화하는 표준 방법이 있습니까?MS Ajax에서 사용하기 위해 JavaScript 문자열에 NET 문자열을 입력하시겠습니까?

telecom 2023. 2. 24. 13:15
반응형

를 부호화하는 표준 방법이 있습니까?MS Ajax에서 사용하기 위해 JavaScript 문자열에 NET 문자열을 입력하시겠습니까?

SQL Server 예외 출력을 클라이언트에게 전달하려고 합니다.RegisterStartUpScript의 MS Script Manager 메서드입니다.NET 3.5이는 일부 오류에 대해 올바르게 작동하지만 예외에 작은 따옴표가 포함되어 있으면 경고가 실패합니다.

하지만 나는 작은 인용문만 피하고 싶지는 않다.JavaScript에서 사용하는 특수 문자를 이스케이프하기 위해 호출할 수 있는 표준 함수가 있습니까?

string scriptstring = "alert('" + ex.Message + "');";         
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);

편집:

@tspeczek 덕분에, 그 코드는 거의 나에게 효과가 있었습니다:) 하지만 약간의 수정(작은 따옴표 생략)으로 효과가 있습니다.

여기에 제 수정본을 포함했습니다...

public class JSEncode
{
    /// <summary>
    /// Encodes a string to be represented as a string literal. The format
    /// is essentially a JSON string.
    /// 
    /// The string returned includes outer quotes 
    /// Example Output: "Hello \"Rick\"!\r\nRock on"
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static string EncodeJsString(string s)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("\"");
        foreach (char c in s)
        {
            switch (c)
            {
                case '\'':
                    sb.Append("\\\'");
                    break;
                case '\"':
                    sb.Append("\\\"");
                    break;
                case '\\':
                    sb.Append("\\\\");
                    break;
                case '\b':
                    sb.Append("\\b");
                    break;
                case '\f':
                    sb.Append("\\f");
                    break;
                case '\n':
                    sb.Append("\\n");
                    break;
                case '\r':
                    sb.Append("\\r");
                    break;
                case '\t':
                    sb.Append("\\t");
                    break;
                default:
                    int i = (int)c;
                    if (i < 32 || i > 127)
                    {
                        sb.AppendFormat("\\u{0:X04}", i);
                    }
                    else
                    {
                        sb.Append(c);
                    }
                    break;
            }
        }
        sb.Append("\"");

        return sb.ToString();
    }
}

아래 설명과 같이 - 원본 출처: 여기

본 적 있어요?

이 함수의 프럼은 HTML을 캡슐화할 때 일반적으로 대역 외 문자를 인코딩하지 않는다는 것입니다.따라서 문자열을 포함하려고 하면 문제가 생깁니다."Atribute 값 내부 또는 시퀀스 문자열이 있는 경우</script>스크립트 요소 내에 있습니다.스크립트 주입 및 XSS가 발생할 수 있습니다.

다음 항목을 추가할 수 있습니다.

            case '<':
                sb.Append("\\x3C");
                break;
            case '"':
                sb.Append("\\x22");
                break;
            case '&':
                sb.Append("\\x26");
                break;

일반적으로 JS 문자열 리터럴인코더보다 표준 JSON 인코더를 사용하는 것이 좋습니다.이를 통해 문자열이 아닌 JS에 간단한 데이터 유형을 전달할 수 있습니다.

.NET 3.5에서는 JavaScriptSerializer를 사용할 수 있지만, 이것이 인코딩되는 것에 주의해 주세요.<로.\u003C(그 때문에, 출력은, 에서의 사용에 적합합니다.<script>element)는 부호화되지 않습니다.&또는"따라서 이러한 콘텐츠를 속성 값에 포함하려면 HTML 이스케이핑이 필요하며 XHTML 스크립트 요소에는 CDATA 래퍼가 필요합니다.

(많은 JSON 인코더와 마찬가지로 U+2028 LINE SEPARATOR 및 U+2029 CLARG SEPART 문자를 부호화하지 못합니다.위의 코드는 모든 비 ASC가 이스케이프되기 때문에 해당됩니다.II 문자이로 인해 이러한 문자가 JS 문자열 리터럴에 포함되어 있으면 JavaScript가 ASCII 줄바꿈과 동일하게 취급하기 때문에 'unterminated string literal' 오류가 발생합니다.)

오래된 스레드이지만 Microsoft AntiX에 대해 알고 싶을 수도 있습니다.SS 라이브러리: 에서 동작하는 Javascript 인코딩 방식을 사용합니다.넷 2 이후

http://msdn.microsoft.com/en-gb/security/aa973814.aspx

언급URL : https://stackoverflow.com/questions/2920752/is-there-a-standard-way-to-encode-a-net-string-into-javascript-string-for-use-i

반응형