2009-09-22 6 views
0

다음 PHP MySQL 문이 SQL 삽입을 방지합니까?SQL 인젝션 방지

$strSQL = "SELECT * FROM Benutzer WHERE Benutzername = '".$Benutzer."' AND Password = '".md5($PW)."'"; 

변수] $Benutzer$PW은 사용자로부터 입력입니다.

' or 0=0 --, " or 0=0 --, or 0=0 --, ' or 0=0 #, " or 0=0 #, or 0=0 #, ' or 'x'='x, " or "x"="x, ') or ('x'='x, ' or 1=1--, " or 1=1--, or 1=1--, ' or a=a-- :

우리는 일반적인 SQL 주입 기술에 대한 사용자 이름과 암호를 확인하고 , " or "a"="a, ') or ('a'='a, ") or ("a"="a, hi" or "a"="a, hi" or 1=1 --, hi' or 1=1 --, hi' or 'a'='a, hi') or ('a'='ahi") or ("a"="a.

나는 뭔가가 부족합니까? SQL 인젝션을 방지하기 위해 다른 방법을 사용해야합니까?

+2

여기서 오는 변수는 무엇입니까? 당신은 로그인을 건너 뛰는 것을 언급합니다. 그렇다면 쿠키로부터 변수가 나왔다는 말입니까? – robjmills

+0

변수는 $ _POST에서오고 함수로 보내집니다. 로그인에 성공하면 Session-Var을 작성합니다. 건너 뛰는 것은 유효한 비밀번호없이 로그인하는 것을 의미합니다. - 그런데 - 너무 많은 빠른 답장을 보내 주셔서 감사합니다. – wildhaber

+0

문자열을 추가하여 SQL이 생성되는 것을 본다면 시끄러운 소리가 울립니다. 항상 바인딩 된 매개 변수를 사용하십시오 (사용 가능한 경우). PHP의 PDO 및 MySQLi 라이브러리를 참조하십시오. – Cheekysoft

답변

9

데이터베이스를 쿼리하기위한 매개 변수가있는 쿼리를 조사 할 수 있습니다. 이렇게하면 SQL 주입 공격이 제거됩니다.

나는 PostgreSQL을 주로 작업, 그리고 이러한 쿼리를 수행하는 형식은 다음과 같이 보일 것입니다 :

$query = 'select * from Benutzer where Benutzername = $1 and Passwort = $2'; 
$params = array($Benutzer, md5($PW)); 
$results = pg_query_params($query, $params); 

대부분의 데이터베이스는이 funationality과 유사합니다 기능을 가지고있다.

나는 이것이 도움이되고 행운이 있기를 바랍니다. 카일

+0

PDO는 이와 같이 작동합니다. http://fr2.php.net/manual/en/pdostatement.execute.php – Aif

-1

mysql_real_escape_string()

$strSQL = "SELECT * 
     FROM Benutzer 
     WHERE Benutzername = '".mysql_real_escape_string($Benutzer)."' 
     AND Passwort = '".mysql_real_escape_string(md5($PW))."'"; 

사용자가 등록 할 때, 당신은 예를 들어 동일한 기술 ...를 사용하여 등록하는 것이 있는지 확인하여보십시오,

AND Passwort = '".mysql_real_escape_string(md5($PW))."'" 

AND Passwort = '".md5(mysql_real_escape_string($PW))."'" 

다른 생성 할 수 결과는 입력 텍스트에 따라 다릅니다.

네,이 암호에도 "소금"을 추가하십시오. 몇 가지 아이디어를 들어이

SHA1 같은 (MD5 ($ 패스))를 수행
SHA1 ($ 소금 $ 전달합니다.) (. $ 패스 $ 소금)
SHA1을 :.
SHA1 ($ 사용자 이름 $ 패스) :
sha1 ($ username. $ pass. $ salt) :

+2

MD5는 16 진수이며 0-9 또는 A-F 이외의 문자는 포함하지 않으므로 mysql_real_escape_string()을 사용하여 암호를 이스케이프 할 필요가 없습니다. –

+2

아니요, 이스케이프 문자열을 사용하지 마십시오. 바운드 매개 변수를 사용하십시오. –

+2

특별한 경우에는 탈출 할 필요가 없지만, 문자열 제작을 사용하려면 * every * 문자열에서 이스케이프를 사용하는 것이 좋습니다. 우려 사항 분리 : MD5 다이제스트에서 유효한 문자가 무엇인지 아는 것이 쿼리 작성자의 역할이 아니며 나중에 누군가가 md5 호출을 걱정해야하는 문자가 포함될 수있는 다른 것으로 바꿀 것입니다. – bobince

5

충돌 가능성이 적기 때문에 MD5보다 SHA1과 같은 알고리즘을 사용하는 것이 좋습니다. salting your passwords이어야합니다. 그렇지 않으면 rainbow tables을 사용하여 비밀번호를 해독 할 수 있습니다.

또한 mysql_real_escape_string()을 사용하여 일을 벗어나기 만하면됩니다. 단순히 검색을 수행하고 일반적인 주사를 대체하지 마십시오.

+9

아니요, 이스케이프 문자를 사용하지 않습니다 *. 문자열 이스케이프 처리는 잘못하기 쉽고 올바르게 수행하기가 쉽지 않습니다. 바운드 매개 변수를 사용하십시오. 바인드 된 매개 변수는 대체 채널을 통해 데이터베이스로 보내 지므로 SQL로 해석 할 수 없습니다. –

+5

'mysql_real_escape_string()'은 MySQL 서버에 의해 실행되며, MySQL 사람들은 그 정보를 얻는 것에 대해 한두 가지를 알고 있다고 생각합니다. –

+0

또는 MySQL 팀인 IIRC가 만든 PHP의 MySQL 라이브러리. –

2

보안이 가능한 한 높아야하는 경우 md5와 같은 다른 해싱 방법을 사용해야합니다. sha256. 또한 암호 용 소금을 사용하십시오.

+1

그는 SQL 삽입에 대해 질문하고 있습니다. – Pawka

+1

예, 그 부분은 이미 답변되었습니다. 그는 또한 그가 높은 보안을 원한다고 말했다 - 그래서 나는 그에게 몇 가지 추가 팁을 무료로 주었다. – gnud

0

보안 표준은 가능한 한 높아야합니다.

md5가 눈썹을 올리거나 커피를 뱉어내는 사람이없는 디자인에 md5가 포함되어있는 경우 클라이언트의 보안 문제를 다시 검토해야합니다. 보안이 매우 중요하다면 보안 전문가가 팀에 합류해야 할 필요가 있습니다. 모든 사람들은 보안 코드를 원한다고 말합니다. 돈을 기꺼이 지불하는 사람은 거의 없기 때문에 실제로 그것을 얻는 사람은 거의 없습니다.

0

XSS를 방지하기 위해 모든 공개 콘텐츠를 strip_tags해야하거나 자신의 html 필터를 사용해야합니다.

+0

을 참조하십시오. 출력 단계에서 htmlspecialchars()가 XSS를 방지하기 위해 올바른 작업을 수행해야합니다. – bobince

+0

일부 사용자가 생성 한 HTML을 표시하고 싶지 않으면 ... – Citizen

관련 문제