2013-02-23 3 views
-1

잠시 동안 JSP를 사용하고 있습니다. 나는이 선택 진술을 가지고있다 :JavaScript/jQuery를 사용하여 SQL 삽입 방지

query = "SELECT * FROM USER_PASS WHERE USERNAME = '" + name + "'"; 

이것은 SQL 주입에 취약하다. 필자는 몇 가지 기사를 검색하여 준비된 문을 사용하여 SQL 주입을 피할 수 있음을 발견했습니다. 나는 그것이 더 혼란 스럽다는 것을 안다. 사용자가 입력 한 내용에 ;, ' 또는 --과 같은 입력 사항을 찾을 수 있다면이 기호를 사용할 수 없다는 경고 메시지를 표시 할 수 있으며 데이터를 처리하지 않습니다. 내 자바 스크립트 코드 일 수 있습니다 :

function validateSQL() 
{ 
var x=document.forms["myForm"]["username"].value; 
var pos = 0; 
pos=x.indexOf("'"); 
if (pos!=0) 
    { 
    alert("Trying to hack me?"); 
    return false; 
    } 
} 

어느 것이 더 사용 하시겠습니까? 이것에는 어떤 단점이 있습니까?

+9

누가 침입자가 프론트 엔드를 사용하겠습니까? 자동 SQL 인젝션 툴은 HTTP 요청을 전송합니다. – Blender

+0

@Blender : 자바 스크립트 코드 대신 preparedstatement를 작성한다면 주입을 방지 할 수 있습니까? –

+2

내가 블렌더의 코멘트를 +10 할 수 있다면 * 클라이언트를 신뢰할 수 없다 *. 서버에 준비된 명령문은 * 모든 * SQL 주입 공격을 막아줍니다 (그러나 반드시 다른 표면은 아님). 아닙니다 : 잘못된 정보를 방지하는 것은 SQL 주입 공격의 범위를 벗어납니다. –

답변

6

당신을 보호하기 위해 클라이언트의 자바 스크립트에 절대적으로 의존 할 수 없습니다. 악의적 인 사용자는 클라이언트 쪽 검사를 쉽게 피할 수 있습니다. 브라우저에서 언제든지 JavaScript를 비활성화 할 수 있습니다.

혼란스러워하는 것이 당신이하지 말아야한다는 것을 의미하지는 않습니다. 매개 변수화 된 쿼리는 혼란스럽지 않으므로 이해할 때까지 연습하고 학습해야합니다. ; , --은 SQL 삽입을 일으킬 수있는 유일한 기호에 근접하지 않습니다.

저는 JSP에 익숙하지 않아 쿼리를 준비하는 방법이 충분히 간단 해 보입니다.

String myquery = "SELECT * FROM USER_PASS WHERE USERNAME = ?"; 
PreparedStatement mystatement = connection.prepareStatement(myquery); 
mystatement.setString(1, name); 
ResultSet myresults = mystatement.execute();