Jint: λ°˜μ‚¬ 방지 / GetType

에 λ§Œλ“  2016λ…„ 03μ›” 01일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: sebastienros/jint

μ•ˆλ…•,
λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš©μ„ μ œν•œν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?
μ‚¬λžŒλ“€μ΄ .NET μœ ν˜•μ—μ„œ .GetType을 μ‚¬μš©ν•˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ μ½”λ“œμ— "GetType"이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μžˆμ§€λ§Œ 100% μ•ˆμ „ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
λ©”μ„œλ“œ ν˜ΈμΆœμ„ μˆ˜λ™μœΌλ‘œ ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” μ΄λ²€νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μžλ™ ν•΄κ²°λ˜λŠ” λŒ€μ‹ ?

μ•„λ‹ˆλ©΄ λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš©μ„ λ°©μ§€ν•˜λŠ” 섀정이 μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

ObjectWrapper.csμ—μ„œ DeclaredOnly에 λŒ€ν•œ BindingFlagλ₯Ό μΆ”κ°€ν•˜λ„λ‘ 84행을 λ³€κ²½ν–ˆμœΌλ©° "GetHashCode" 및 "GetType"에 λŒ€ν•œ ν˜ΈμΆœμ„ μ°¨λ‹¨ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

            // if no properties were found then look for a method (edited)
            var methods = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
                .Where(m => EqualsIgnoreCasing(m.Name, propertyName))
                .ToArray();

λͺ¨λ“  17 λŒ“κΈ€

.NET 클래슀의 μ‚¬μš©μ„ μ „μ²΄μ μœΌλ‘œ λ°©μ§€ν•˜κ±°λ‚˜ νŠΉμ • λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€. μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ μ›ν•˜λŠ” 속성과 λ©”μ„œλ“œλ§Œ λ…ΈμΆœν•˜λŠ” 래퍼 개체λ₯Ό .netμ—μ„œ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— jsμ—μ„œ λ‚΄ 개체λ₯Ό λ…ΈμΆœν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 그듀은 μ—¬μ „νžˆ ​​.GetType을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ‹€μ œ 객체에 μ ‘κ·Όν•˜λŠ” 데 μ‚¬μš©λ  수 있고 훨씬 더 많이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ €μ—κ²Œ λ³΄μ•ˆ λ¬Έμ œμž…λ‹ˆλ‹€.

λ§žμŠ΅λ‹ˆλ‹€. .NET이 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν•  수 μžˆλŠ” 일은 μ—†μŠ΅λ‹ˆλ‹€. 래퍼(AutoMapper μ°Έμ‘°) λŒ€μ‹  μƒˆ 개체λ₯Ό λ§Œλ“€κ³  전달할 수 μžˆμŠ΅λ‹ˆλ‹€. DTO처럼.

.net의 "객체"에 직접 있기 λ•Œλ¬Έμ— λͺ¨λ“  κ°μ²΄μ—λŠ” GetType()이 μžˆμŠ΅λ‹ˆλ‹€.

OnMethodCall λ˜λŠ” OnResolveMethod 같은 후크가 μžˆμŠ΅λ‹ˆκΉŒ?
κ·Έλž˜μ„œ μˆ˜λ™μœΌλ‘œ 방법을 ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ μ•‘μ„ΈμŠ€λ₯Ό κ±°λΆ€ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

동적 개체λ₯Ό μ‚¬μš©ν•˜κ³  λ©”μ„œλ“œ 해결을 μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2016λ…„ 3μ›” 1일 ν™”μš”μΌ μ˜€ν›„ 1μ‹œ 58λΆ„, asdfgasdfsafgsdfa [email protected]
썼닀:

λͺ¨λ“  κ°μ²΄λŠ” GetType()을 κ°€μ§‘λ‹ˆλ‹€.
.κ·Έλ¬Ό

OnMethodCall λ˜λŠ” OnResolveMethod 같은 후크가 μžˆμŠ΅λ‹ˆκΉŒ?
κ·Έλž˜μ„œ μˆ˜λ™μœΌλ‘œ 방법을 ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ μ•‘μ„ΈμŠ€λ₯Ό κ±°λΆ€ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/sebastienros/jint/issues/275#issuecomment -190852140.

@doronguttman λ§žμŠ΅λ‹ˆλ‹€. λž˜νΌκ°€ 이λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œκ² μŠ΅λ‹ˆλ‹€. 정보 κ°μ‚¬ν•©λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•,
이 문제λ₯Ό μ œμΆœν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. JS 엔진에 .Net 개체λ₯Ό μ „λ‹¬ν•˜λ©΄ JSκ°€ .GetType() λ₯Ό ν˜ΈμΆœν•  수 μžˆμ„ 거라고 μƒκ°ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ JS μ½”λ“œκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λ―Όκ°ν•œ 정보λ₯Ό μ €μž₯ν•˜λŠ” λ‹€μ–‘ν•œ 클래슀의 ν•„λ“œλ₯Ό 검색할 수 있기 λ•Œλ¬Έμ— 이것은 λ³΄μ•ˆ λ¬Έμ œμ΄κΈ°λ„ ν•©λ‹ˆλ‹€.

μ›λž˜ λ©”μ„œλ“œλ₯Ό 숨기기 μœ„ν•΄ "GetType" μƒˆ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ λ‚΄κ°€ Jint에 μ „λ‹¬ν•œ κ°œμ²΄μ— λŒ€ν•΄ μΆ©λΆ„ν• κΉŒμš”? 이와 같이:

C# public class Api { public new void GetType() { // Don't allow JS code to get the type } }

이것을 μ‹œλ„ν–ˆμ„ λ•Œ μž‘λ™ν•˜λŠ” 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€(Javascriptμ—μ„œλŠ” .GetType()을 ν˜ΈμΆœν•˜μ—¬ μ •μ˜λ˜μ§€ μ•ŠμŒ). κ·ΈλŸ¬λ‚˜ 이것을 μš°νšŒν•˜λŠ” 방법이 μžˆλŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€(.Netμ—μ„œλŠ” ((object)api).GetType() λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬μ „νžˆ μœ ν˜•μ„ μ–»μŠ΅λ‹ˆλ‹€).
μ΄κ²ƒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€λ©΄ (동적) 래퍼 객체λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  이 μ†”λ£¨μ…˜μ„ μ„ ν˜Έν•©λ‹ˆλ‹€. λ‚˜λŠ” μƒˆλ‘œμš΄ GetType() λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄ Jint에 전달할 수 μžˆλŠ” λͺ¨λ“  클래슀λ₯Ό κ°€μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

이것은 Array 객체에도 ν•„μš”ν•©λ‹ˆκΉŒ? 이것을 ν…ŒμŠ€νŠΈν–ˆμ„ λ•Œ .Net 객체가 .Net Arrayλ₯Ό λ°˜ν™˜ν•  λ•Œ JintλŠ” λ„€μ΄ν‹°λΈŒ μžλ°”μŠ€ν¬λ¦½νŠΈ 배열을 μƒμ„±ν•˜λ―€λ‘œ GetType()이 κ°€λŠ₯ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

Javascript μ½”λ“œκ°€ μ „λ‹¬λœ .Net 객체에 λŒ€ν•΄ .GetType()을 ν˜ΈμΆœν•˜μ—¬ λ‹€λ₯Έ 객체에 μ•‘μ„ΈμŠ€ν•  수 μžˆλ‹€λŠ” 것을 λͺ¨λ“  μ‚¬λžŒμ΄ 깨닫지 λͺ»ν•  것이라고 μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— .Net κ°μ²΄μ—μ„œ 이름이 "GetType"인 호좜 λ©”μ„œλ“œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•Šλ„λ‘ Jintλ₯Ό μˆ˜μ •ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. 클래슀의 ν•„λ“œ.
μ΄λ ‡κ²Œ ν•˜λ©΄ 이미 μ‘΄μž¬ν•˜λŠ” .Net μœ ν˜•μ„ 전달할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€(그렇지 μ•ŠμœΌλ©΄ λ‹€λ₯Έ 개체λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμ— λŒ€ν•œ μƒˆ 래퍼λ₯Ό μ°¨λ‘€λ‘œ μƒμ„±ν•˜λŠ” 동적 래퍼λ₯Ό 생성해야 함).

감사 ν•΄μš”!

@T18970237136

λ‚˜λŠ” 그것이 μ–΄λ–»κ²Œλ“  ν”Όν•  수 μžˆλ‹€κ³  ν™•μ‹ ν•œλ‹€. 그리고 그렇지 μ•Šλ”λΌλ„ "new object()"λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•œ λ‹€μŒ GetType을 μ‚¬μš©ν•˜λŠ” 방법이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ μ΅œμƒμ˜ μ†”λ£¨μ…˜μ€ μΌμ’…μ˜ 호좜 이벀트 λ˜λŠ” ν• λ‹Ήν•  수 μžˆλŠ” 더 λ‚˜μ€ 일뢀 클래슀λ₯Ό κ°–λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄:

class InvokeFilter { virtual MethodInfo ResolveMethod(... ) { /_jintκ°€ 기본적으둜 μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“  μž‘μ—…μ€ 이미_/ } }

그런 λ‹€μŒ μžμ‹ μ˜ 호좜 ν•„ν„°λ₯Ό κ΅¬ν˜„ν•˜κ³  ν•„ν„°λ§ν•˜κ³  싢지 μ•Šμ€ ν•­λͺ©μ„ base.ResolveMethod(...)에 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 μ „ν˜€ κ΅¬ν˜„ν•˜κΈ° μ–΄λ ΅λ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ λ‚˜μ€‘μ— PR을 ν•  κ²ƒμž…λ‹ˆλ‹€.
ν•˜μ§€λ§Œ @sebastienros κ°€ 듀일지 ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€ :S

μ €λŠ” 이것을 μ‚¬μš©μž μ •μ˜ 속성인 JintInteropAttribute둜 κ΅¬ν˜„ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

ObjectWrapper 클래슀의 GetOwnProperty λ©”μ„œλ“œλ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ 이 νŠΉμ„±μ˜ 쑴재 여뢀에 따라 λ°˜μ‚¬λ₯Ό 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 Jint에 μ „λ‹¬λœ .NET 개체λ₯Ό μž κ°€μ•Ό ν•©λ‹ˆλ‹€(기본적으둜 GetType, ToString 및 GetHashCode λ“±κ³Ό 같은 λ©”μ„œλ“œλ₯Ό μˆ¨κΉ€). 그런 λ‹€μŒ μ†μ„±μœΌλ‘œ μž₯μ‹ν•˜μ—¬ 클래슀 멀버에 μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[JintInterop]
public void CallMe()
{
}

(NB .NET 클래슀 및 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•œ 직접 μ•‘μ„ΈμŠ€λ₯Ό ν—ˆμš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€)

μ‚¬μš©μž 지정 속성을 λ§Œλ“œλŠ” λŒ€μ‹  멀버(속성, ν•„λ“œ, λ©”μ„œλ“œ λ“±)에 λŒ€ν•œ λ¦¬ν”Œλ ‰μ…˜μ΄ 호좜될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ˜λŠ” μ˜΅μ…˜μ—μ„œ 이벀트λ₯Ό λ§Œλ“€κ³  이λ₯Ό ν—ˆμš©/λΉ„ν—ˆμš©ν•˜λ €λ©΄ true/falseλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ μ‚¬μš©μž μ •μ˜ 속성을 μ‚¬μš©ν•˜κ±°λ‚˜ 이름을 ν™•μΈν•˜λŠ” 것과 같이 μ½”λ“œμ—μ„œ 자체 논리λ₯Ό λ§Œλ“€μ–΄ 차단할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 일반적인 경우의 μ„±λŠ₯에도 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

쒋은 생각이야. λ˜ν•œ ν”„λ‘œμ νŠΈμ—μ„œ Jint에 λŒ€ν•΄ μ•Œ ν•„μš”κ°€ 없을 μˆ˜λ„ μžˆλŠ” Jint에 λŒ€ν•œ 쒅속 κ°€λŠ₯성을 μ€„μž…λ‹ˆλ‹€.

이 문제 #523을 돕기 μœ„ν•΄ ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό λ°œν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

JsValue.FromObject λ©”μ†Œλ“œκ°€ Syste.Type λ₯Ό TypeReference 둜 λ³€ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 이것은 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 일반 λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•  수 μ—†μœΌλ©° 이미 μ•Œλ €μ§„ μœ ν˜•λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

IObjectConverter λ₯Ό μΆ”κ°€ν•˜μ—¬ νŠΉμ • μœ ν˜•μ„ ν—ˆμš©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

ObjectWrapper.csμ—μ„œ DeclaredOnly에 λŒ€ν•œ BindingFlagλ₯Ό μΆ”κ°€ν•˜λ„λ‘ 84행을 λ³€κ²½ν–ˆμœΌλ©° "GetHashCode" 및 "GetType"에 λŒ€ν•œ ν˜ΈμΆœμ„ μ°¨λ‹¨ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

            // if no properties were found then look for a method (edited)
            var methods = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
                .Where(m => EqualsIgnoreCasing(m.Name, propertyName))
                .ToArray();

κΈ€μŽ„, λ‚˜λŠ” λ°˜λŒ€λ‘œ λ¬»μŠ΅λ‹ˆλ‹€. GetType을 μ–΄λ–»κ²Œ ν™œμ„±ν™”ν•©λ‹ˆκΉŒ? λ‚˜λ₯Ό μœ„ν•΄ 항상 null을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. GetMethod κΈ°λŠ₯이 ν•„μš”ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰