[PHP 보안]MYSQL 쿼리 필터링하기 - 이동마이

Program/오래된 PHP 게시판

안녕하세요. 필자입니다. 요즘 sql인젝션이 증가하고 있습니다.. ㅠㅠㅠ (오늘의 유머도 한번 털렸다고 하네요) 제 사이트는 안그러는데요 다른곳은 그러다라고요. 아무튼 지금부터 강의 시작해보도록 하겠습니다.


먼저 sql인젝션을 알려드리도록하겠습니다.


sql 인젝션이란 특정한 수단을 통하여 특정한 쿼리를 취급하는 페이지에 오염된 sql명령을 보내겁니다. 저희가 그냥 페이지에서 폼을 전송해도 오염된 데이터라고 보면됩니다. 하지만 sql인젝션은 오염된데이터 중에서 쓰래기급에 속하는 최하급 해킹입니다.


제가 설명을 못해서 위키백과를 인용하도록 하겠습니다.

---------------------------------------------------------------

SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용프로그램 보안 상의 허점을 의도적으로 이용해, 개발자가 생각지 못한 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 방법이다.

---------------------------------------------------------------


뭐 이렇습니다.


인젝션 방법은 다음과 같습니다만

<form action="페이지" method="post">

아이디:<input type="text" name="id"><br>

암호문:<input type="password" name="pw"><br>

<input type="submit" value="로그인">

</form>


이란 폼이 있다고 칩니다.


그러면 php문은


<?php

$ok=mysql_query("SELECT * FROM `idongmai` WHERE  `id`='$_POST[id]' and `pw`='$_POST[pw]' ");

while ($mem=mysql_fetch_array($ok)){

//여기에는 성공할때 쓸 명령

}

?>


이런식으로 작성이 됩니다.


하지만 이는 보안취약점이 큽니다.


인젝션공격 사용의 예) admin'-- 처럼 폼에 입력후 로그인하면 - 다음부터는 주석으로 처리되어 값이 참이 되버리는 불상사가 일어나는경우가 있습니다. 그래서 한번 필터링하고 한번 더 로그인체크해줘야 합니다.


<?php

$mem = array(); //배열을 비워줍니다.

$_POST[id]=mysql_real_escape_string($_POST[id]); //id필터링

$_POST[pw]=mysql_real_escape_string($_POST[pw]); //pw필터링

$ok=mysql_query("SELECT * FROM `idongmai` WHERE  `id`='$_POST[id]' and `pw`='$_POST[pw]' "); //쿼리문 시작

while ($mem=mysql_fetch_array($ok)){ //로그인 체크 시작

if ($_POST[id]==$mem[id] and $_POST[pw]==$mem[pw]){ //로그인 필터링 시작

echo "로그인이 완료되었습니다.";

else // 로그인이 실패할경우

echo "로그인 실패! 다시도전하세요 흐흐흐";

} // 로그인 필터링 종료

} // 인젝션에 체크문 종료

?>


저같은 경우 저렇게 복잡한 방법으로 코딩을 합니다.


단순한 소스가 더 해킹위험이 적으니 주의하고 사용하시면 됩니다.





   


아래의 손가락버튼을 눌러주시면 블로그에 큰 힘이 됩니다.






Name(이름)
Password(비밀번호)
Homepage(홈페이지)
Secret(비밀글)