해결된 질문
작성
·
48
·
수정됨
1
코드는 이렇습니다
중간에 echo는 제가 찍어본 것이고
admin'-- 이렇게 입력하면
query : 'select * from member where id='admin'--' and pw='b59c67bf196a4758191e42f76670ceba''
쿼리는 이렇게 찍히는데
Fatal error: Call to a member function fetch_assoc() on a non-object in <b>C:\APM_Setup\htdocs\login\loginAction.php
결과값이 없다고 오류가 나버립니다.
mysql에서 직접 admin'-- 이렇게 넣어봐도 잘 나오는데...
뭐가 문제일까요?
+강의 뒷부분의 'or1=1-- 도 넣으면 에러납니다.
답변 2
1
0
안녕하세요, 인프런 AI 인턴입니다.
Hyun Jo님이 제기하신 문제는 SQL 쿼리 작성 시 부적절한 주석 처리 때문에 발생할 가능성이 큽니다. 현재 사용하고 계신 쿼리에서 admin'--
같은 입력이 주어지는 경우, SQL 주석으로 인해 쿼리의 나머지 부분이 무시되어, 의도치 않은 쿼리가 실행될 수 있습니다. 특히, PHP에서의 fetch_assoc()
함수가 호출되면서도 해당 객체가 반환되지 않은 상황은 query()
메서드가 실패했을 때 발생할 수 있습니다. 이는 query()
결과가 false
일 경우에 발생하며, 보통은 SQL 문법 오류나 쿼리 실행 실패로 인해 query()
가 실패하게 됩니다.
SQL 주석 문제:
admin'--
를 입력할 경우, --
뒤의 내용은 SQL에서 주석 처리되어 무시됩니다. 따라서, SQL 쿼리가 select * from member where id='admin'
까지만 실행되고, and pw=''
부분은 무시되는 상황이 발생할 수 있습니다. 이로 인해, 데이터베이스 쿼리가 실패하거나 예상 외의 결과가 반환됩니다.
해결 방안:
mysqli
의 prepare()
메서드, 혹은 PDO의 prepare()
메서드를 사용할 수 있습니다.mysqli_real_escape_string()
을 사용하여 탈출 문자를 추가할 수도 있습니다.참고할 수 있는 유사한 게시물:
해당 링크에서는 SQL 인젝션 공격의 원인 및 유사 사례에 대한 해결책을 포함하고 있습니다. 입력 값 필터링, 준비된 쿼리 사용 등 기본적인 보안 조치에 대한 설명이 포함되어 있습니다.
현재 상황에서는 데이터베이스 연결 및 쿼리 실행 중 문제 해결을 위해 쿼리 디버깅 및 준비된 쿼리 사용을 중점적으로 고려해 보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.