url 파라미터로 전달된 로그인 파라미터 해결 비활성화 방법 / url에서
응용 프로그램이 요청된 모든 것을 기록합니다.urls. 즉, URL 파라미터를 사용하여 인증하지 않는 것이 중요합니다.로그가 쌍으로 가득 찬 상황이 발생하기 때문입니다.(login=abc&password=123)이 때문에, 이 설정을 실시했습니다.spring-security매개 변수를 읽다request-body. 다음 행을 추가합니다.request-header:
'Content-Type': 'application/x-www-form-urlencoded'
본문은 다음과 같습니다.
{'login':'admin', 'password':'password'}
괜찮습니다만, QA는 URL 파라미터에 의한 인증의 가능성을 무효로 하도록 강요하고 있습니다.현시점에서는, 다음의 URL 에의 POST 도 인증됩니다.
https://example.com/foo?login=admin&password=password
이 옵션을 비활성화하는 방법을 아는 사람이 있습니까?주석 포함이 바람직합니다.
코멘트 때문에 저는 제 문제에 더 많은 세부사항을 추가하기로 했습니다.나의spring-security로 설정되어 있다.WebSecurityConfigurerAdapter.있습니다
http.usernameParameter("login")
.passwordParameter("password")
(...)
이렇게 하면Spring매개 변수와 본문 모두에서 로그인 데이터를 검색합니다.url의 파라미터 검색을 해제하고 싶습니다.
그러면 스프링이 매개 변수와 본문 모두에서 로그인 데이터를 검색합니다.url의 파라미터 검색을 해제하고 싶습니다.
이 동작은 JavaEE 자체보다는 Spring에 의해 구현되지 않기 때문에 불가능하다고 생각합니다.
Http ServletRequest.getParameter 문서 상태:
요청 파라미터의 값을 String으로 반환하고 파라미터가 존재하지 않으면 null로 반환합니다.요청 매개 변수는 요청과 함께 전송되는 추가 정보입니다.HTTP 서블릿의 경우 매개 변수는 조회 문자열 또는 게시된 양식 데이터에 포함됩니다.
다만, 다음과 같은 필터로 이것을 변경할 수 있습니다.
public class DisableGetAuthFiler extends OncePerRequestFilter {
...
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(
new HttpServletRequestWrapper(request) {
@Override
public String getParameter(String name) {
if (("login".equals(name) && getQueryString().contains("login"))
|| ("password".equals(name) && getQueryString().contains("password"))) {
return null;
} else {
return super.getParameter(name);
}
}
},
response
);
}
}
이디타임 라만은 새로운 필터를 도입하는 대신 기존 필터를 사용하는 또 다른 솔루션을 제안했다.나만이 우선권을 제안하고 싶다.obtainUsername()그리고.obtainPassword()대신attemptAuthentication().
저는 스프링 보안 래터를 기반으로 한 대안을 제안하고 침미가 제안한 회피책을 제안하고 싶습니다.
이 답변은 brees26 답변에서 xenteros가 제안한 문제에 대한 해결책도 제공합니다.
기존 Username Password를 덮어씁니다.Authentication Filter 구현
public class ImprovedUsernamePasswordAuthenticationFilter
extends UsernamePasswordAuthenticationFilter {
@Override
protected String obtainUsername(HttpServletRequest request) {
final String usernameParameter = getUsernameParameter();
validateQueryParameter(request, usernameParameter);
return super.obtainUsername(request);
}
@Override
protected String obtainPassword(HttpServletRequest request) {
final String passwordParameter = getPasswordParameter();
validateQueryParameter(request, passwordParameter);
return super.obtainPassword(request);
}
private void validateQueryParameter(HttpServletRequest request, String parameter) {
final String queryString = request.getQueryString();
if (!StringUtils.isEmpty(queryString)) {
if (queryString.contains(parameter))
throw new AuthenticationServiceException("Query parameters for login are a prohibit, use message body only!");
}
}
}
독자적인 실장을 기존의 실장으로 치환할 필요가 있습니다(여기에 있는 문서를 참조해 주세요.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home","/login").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.permitAll()
.and()
//Replace FORM_LOGIN_FILTER with your own custom implementation
.addFilterAt(improvedUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.exceptionHandling()
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))
.and()
//disable csrf to allow easy testing
.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
public UsernamePasswordAuthenticationFilter improvedUsernamePasswordAuthenticationFilter() throws Exception {
UsernamePasswordAuthenticationFilter authFilter = new ImprovedUsernamePasswordAuthenticationFilter();
authFilter.setRequiresAuthenticationRequestMatcher(
new AntPathRequestMatcher("/login", "POST")
);
authFilter
.setAuthenticationManager(authenticationManager());
authFilter
.setAuthenticationSuccessHandler(
new SavedRequestAwareAuthenticationSuccessHandler()
);
authFilter
.setAuthenticationFailureHandler(
new SimpleUrlAuthenticationFailureHandler("/login?error")
);
return authFilter;
}
}
장점: 스프링 보안 기반이며 변화에 유연하게 대응합니다.
단점:안타깝게도 Spring Java Config는 설정 및 읽기가 매우 어려웠습니다.
편집: chimmi 코멘트를 받아 getUsername과 getPassword를 덮어썼습니다.
소스 코드는 github에서 찾을 수 있습니다.
때,이 말한 처럼 Jhan을 이 될 것입니다.@RequestMapping(value="/login", method="RequestMethod.POST")그러면 사용자가 URL로 전달할 수 있는 파라미터에 관계없이 URL과 URI는 항상 /login으로 기본 설정됩니다.이치노쌍이 아니라 " " " " 입니다."http://localhost:8080/login"또는 포트가 무엇이든 상관없습니다.
하려면 , 「」를 변경해 주세요.UsernamePasswordAuthenticationFilter의 »RequestMatcher §:
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.withObjectPostProcessor(new ObjectPostProcessor<UsernamePasswordAuthenticationFilter>() {
@Override
public <O extends UsernamePasswordAuthenticationFilter> O postProcess(
O filter) {
AntPathRequestMatcher pathMatcher = new AntPathRequestMatcher("/login", "POST");
RequestMatcher noQuery = new RequestMatcher() {
@Override
public boolean matches(HttpServletRequest request) {
return request.getQueryString() == null;
}
};
AndRequestMatcher matcher = new AndRequestMatcher(Arrays.asList(pathMatcher, noQuery));
filter.setRequiresAuthenticationRequestMatcher(matcher);
return filter;
}
})
.and()
...
}
}
메모: 다음 요건은 GET 요구가 발행되는 것을 막지는 않습니다(따라서 자격 정보가 누출됩니다).이 문제가 발생하지 않도록 하는 것은 UI에 달려 있습니다.
괜찮습니다만, QA는 URL 파라미터에 의한 인증의 가능성을 무효로 하도록 강요하고 있습니다.
언급URL : https://stackoverflow.com/questions/38716703/how-do-i-disable-resolving-login-parameters-passed-as-url-parameters-from-the
'programing' 카테고리의 다른 글
| HikariPool-1 - driverClassName에는 jdbcUrl이 필요합니다. (0) | 2023.04.04 |
|---|---|
| 날짜 형식을 angularjs로 지정하는 방법 (0) | 2023.04.04 |
| Redx Reducer 내부의 상태에 액세스하는 방법 (0) | 2023.04.04 |
| mysql_real_escape_string을 PHP7로 변환하려면 어떻게 해야 하나요? (0) | 2023.04.04 |
| $watch 이벤트를 angularjs에서 수동으로 실행 (0) | 2023.04.04 |