2012-05-26 5 views
3

필자는 PHP에서 준비된 구문에 대한 필요성을 보여 주려고했지만 PHP는 문자열을 양식에 전달할 때 편리하게 이상한 일을하기 때문에 약간의 문제가 발생했습니다. 내가 노력하고있어PHP 폼의 SQL 주입 위협?

성명은 "휴식"는 간단합니다 :

SELECT username FROM users WHERE username = '$username' AND password = '$password'

그러나 PHP는 자동으로 작은 따옴표를 이스케이프 때문에 실제로는 작동하지 않습니다 암호를 X' or TRUE;-- 전달과 같은 일을 과에 문을집니다 :

SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'

그리고 암호 평등 때문에 탈출 따옴표로 그대로 유지됩니다. 이 진술은 안전한 것으로 간주됩니까? 그렇지 않으면 어떻게 깨질 수 있습니까?

+1

개인적으로 나는 주사를 피하고 데이터베이스의 암호와 비교하기 위해 개인적으로 MD5 암호를 사용합니다. 그게 나 일 뿐이야. –

+0

@WilliamIsted : 예, 실제 응용 프로그램으로 작업 할 때 SHA-2를 사용합니다. 이것은 단지 가상의 쿼리 일뿐입니다. – Jengerer

답변

5

마술 따옴표가 켜져있는 것 같습니다. 필자는 PHP 5.4를 실행하는 서버로 옮기는 것처럼 완전히 안전하다고 생각하지 않을 것입니다. 완전히 취약 할 것입니다. 마술 따옴표는 오랫동안 사용되지 않는 기능이었으며 응용 프로그램의 다른 부분을 엉망으로 만들 수 있으므로 사용하지 마십시오.

설명하기 위해 php.ini에서 magic_quotes_gpc = Off을 설정하십시오.

+0

죽은 MySQL 확장과 PDO를 사용하여 무언가를 추가한다면, 이것은 받아 들여진 대답이되어야합니다. – markus

+0

흥미 롭습니다! 필자는 PHP에 비교적 익숙하지 않은 친구를 보여 주려고했지만, 로그인 양식을 무시할 암호를 제공하지 못했습니다. 그런 다음 SQL 쿼리가 내 서버에서 무엇을하는지 테스트 한 결과 동일한 동작을 보였습니다. 알았어, 고마워! – Jengerer

2

PHP 환경에서 Magic Quotes를 사용하도록 설정했기 때문입니다. 자동으로 문자열을 이스케이프하지만 더 이상 사용되지 않아야합니다. 그들은 치료법이 아니며 패치입니다. mysql_real_escape_string과 같은 적절한 위생 방법을 사용하는 것이 훨씬 낫습니다.

http://www.php.net/manual/en/security.magicquotes.what.php

편집 : 또한 준비된 문! PHP에서

기타 "안전하지 않은"안전 기능 :

addslashes - 당신은 안전 생각할 수도 있지만, 주입을 일으킬 수 멀티 바이트 문자를 필터링하지 않습니다.

+0

질문에 언급 된 것처럼 오히려 PDO입니다.) – Ryan

+0

@minitech : 감사합니다 :) –

+0

mysql_ *을 더 이상 사용하지 마십시오! – markus