2010-12-13 2 views

답변

6

JPA는 JDBC와 같습니다. 백엔드 기술입니다. JDBC에 적용되는 것과 동일한 보안 문제가 JPA에 적용됩니다. 따라서 대부분의 보안 고려 사항은 응용 프로그램 수준에서 구현되거나 프런트 엔드 API에서 처리됩니다. 그러나 실제로 JPQL 주입은 당신이 알고 있어야하는 명백한 것입니다.

JPQL 주입 : SQL 또는 JDBC API를 사용하는 경우

그냥 좋아, 당신은 직접 쿼리 문자열에 매개 변수를 추가해서는 안됩니다. Query 개체의 setParameter (adhoc 쿼리와 명명 된 쿼리 모두에 적용) 또는 JPA criteria API (명명 된 쿼리가 최상의 성능을 제공하지만)을 사용할 수 있습니다.

Query query = em.createQuery("DELETE Order WHERE customer = :customer"); 
query.setParameter("customer", customer); 
query.executeUpdate(); 

데이터베이스 권한 :

추가 보안을 위해, 당신이 만들 수있는 여러 지속적 유닛 (PU) 그래서 모든 보안 위반의 영향이 제한됩니다. 예를 들어 데이터베이스 액세스 권한이 다른 여러 PU를 만들 수 있습니다. 하나는 업데이트 권한이 있고 다른 하나는 읽기 전용 쿼리 액세스 권한입니다. 이와 같은 결정이 응용 프로그램 설계에 영향을 미친다는 것을 알기 만하면됩니다.

+0

앱 계층에 PreparedStatement를 만드시겠습니까? 그것들 (AFAIK)을 사용하는 것은 SQL 주입에 대한 주요 방어이며 일반적으로 데이터 계층에서 생성됩니다. – bakoyaro

+1

좋은 지적. 모범 사례가 습관이되면 가끔 나쁜 대안을 잊어 버리는 경우가 있습니다. 나는 그것을 내 대답에 덧붙였다. – Kdeveloper

+1

일반 텍스트 프로토콜을 개발할 때마다 러시아 해커는 유형 안전성의 부족을 악용합니다. 편집을 위해 –

1

신뢰할 수없는 출처에서받은 바이트에서 객체를 비 직렬화하는 경우 부트 클래스 경로에있는 모든 클래스가 public인지 여부에 관계없이로드되어 해당 클래스 초기화가 실행될 수 있습니다. 부작용이있는 생성자와 사용자 정의 직렬화 방법을 통해 권한을 얻을 수도 있습니다. 클래스 패스가 아니라 기관이 직렬화 가능 클래스의 생성자를 통해 연결할 수있는 가장 최근의 JVM과 함께 제공되는 코뿔소 인터프리터, 또는 javac의, 에 javax.tools 인터페이스처럼 무제한의 권한과 함께 public 클래스 알려진이 포함 된 경우

, 공격자는이를 사용하여 임의의 Java 코드를 실행할 수 있습니다. 실제로 이것은 java.lang.Runtime을 통해 현재 사용자의 권한을 가진 임의의 사용자 - 링 코드를 의미합니다.

첫 번째 기준은 쉽게 충족됩니다. 두 번째 것은 아마도 쉽게 만날 수 없을 것입니다.

+1

JPA와 관련이 있는지 확실하지 않습니다. – Kdeveloper

+0

+1 귀하의 의견을 보내 주셔서 감사합니다. – bakoyaro

+0

@Kdeveloper, 나는 JPA 엔티티가 직렬화 될 필요가 있다는 인상하에있었습니다. 그러나 당신 말이 맞습니다. JPA 엔티티가 지속성을 위해 자바 직렬화를 사용하지 않는다면 내 게시물은 부적절합니다. –