나는 취약한 SQL 쿼리를 읽고 응용 프로그램에 주입하려고 시도했습니다. 그것은 충분히 안전하지 않습니다. 데이터베이스 유효성 검사 및 기타 삽입 작업을 위해 Statement Connection을 사용하고 있습니다.preparedStatement가 SQL 삽입을 피합니까?
preparedStatements는 안전한가요? 또한이 진술에 어떤 문제가있을 것인가?
나는 취약한 SQL 쿼리를 읽고 응용 프로그램에 주입하려고 시도했습니다. 그것은 충분히 안전하지 않습니다. 데이터베이스 유효성 검사 및 기타 삽입 작업을 위해 Statement Connection을 사용하고 있습니다.preparedStatement가 SQL 삽입을 피합니까?
preparedStatements는 안전한가요? 또한이 진술에 어떤 문제가있을 것인가?
임의의 입력에서 쿼리를 생성하기 위해 문자열 연결을 사용하면 PreparedStatement
이 안전하지 않습니다. 이 예를 살펴 :
preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";
을 누군가가 userName
로
' or '1'='1
을두고 경우 PreparedStatement
해당 쿼리가
SELECT * FROM users WHERE name = '' OR '1'='1';
로 데이터베이스에서 실행되기 때문에, SQL 인젝션에 취약 할 것
따라서 사용하는 경우
당신은 안전 할 것입니다.
이 코드 중 일부는 this Wikipedia article에서 가져 왔습니다.
setString은 어떤 차이가 있습니까? 실제로 무엇을합니까? 심지어 문자열을 대체합니다. 그것이 다른 점은 무엇입니까? –
@ 모하메드 : 차이가 있습니다. 질의''SELECT * FROM users WHERE name =? ''은 컴파일 된 데이터베이스로 보내지고'setString'의'userName'은 대체 될 것입니다. 데이터베이스에 잘못된 값이 있으면 오류가 발생합니다. 따라서 '또는'1 '='1'은 연산자'또는'및'= '가 포함 된 명령문이 아니라 전체 문자열로 취급됩니다. 데이터베이스는이를 "" '또는'1 '='1 ''값을 가진 문자열로 보게됩니다. – darioo
준비된 문을 올바르게 사용하면 SQL 주입을 방지 할 수 있습니다. 그러나 질문에 코드 예제를 게시하여 올바르게 사용하고 있는지 확인할 수 있습니다.
글쎄 단순히 PreparedStatement
을 사용해도 안전하지 않습니다. 으로 가능한 SQL
쿼리의 매개 변수를 사용해야합니다. 자세한 내용은 here을 참조하십시오.
this article에서 설명한 것처럼 PreparedStatement
만으로도 문자열을 연결하는 경우 도움이되지 않습니다. 예를 들어
, 하나의 악의적 인 공격자는 여전히 다음을 수행 할 수 있습니다
는 그리고 영향을 B 수 있습니다 단지 SQL 아니다. 바인드 매개 변수를 사용하지 않는 경우 JPQL조차도 손상 될 수 있습니다.
결론 SQL 문을 작성할 때 문자열 연결을 사용하지 마십시오. 그 목적을 위해 전용 API를 사용
준비된 문이 갈 수있는 방법입니다. AFAIK 준비된 문장은 한 번만 구문 분석되므로 나중에 SQL 주입 가능성은 없습니다. 물론 XSS 공격 등으로부터 보호하려면 입력을 sanitse해야합니다. – CurtainDog