SQL 인젝션이 위험하다는 얘긴 많이 들었는데 실제로 코드에서 어떻게 막는 건지 감이 안 와서 질문해요. 지금 파이썬으로 로그인 기능 만들고 있는데, 아이디랑 비번 받아서 쿼리 날리는 부분을 이렇게 짰거든요.


query = "SELECT * FROM users WHERE id = '" + user_id + "' AND pw = '" + user_pw + "'"
cursor.execute(query)


이렇게 문자열을 그냥 붙여서 쿼리를 만드는데요, 검색해보니까 이러면 누가 아이디 칸에 이상한 값을 넣어서 쿼리를 통째로 바꿔버릴 수 있다고 하더라고요. 실제로 id 칸에 ' OR '1'='1 이런 걸 넣으면 비번 없이도 로그인이 뚫린다는 게 진짜인가요? 신기하면서도 무섭네요.


일단 급한 대로 입력값에서 따옴표를 제거하거나 위험한 단어를 필터링하는 방법을 생각해봤는데, 이런 식으로 막는 게 맞나요? 근데 이렇게 하나하나 거르는 게 뭔가 근본 해결책은 아닌 것 같기도 하고요.


prepared statement인가 파라미터 바인딩인가 하는 걸 써야 된다는 글도 봤는데, 이게 정확히 뭐고 왜 그걸 쓰면 인젝션이 막히는 건가요? 위 코드를 어떻게 고쳐야 안전한 건지 예시로 좀 알려주시면 감사하겠습니다.