2010-12-15 3 views
0

시스템의 로그인 단위를 테스트하려고했습니다. 내 시스템은 다음과 같이 설계 -SQL, Microsoft SQl

사용자가 사용자 ID 입력하면 - 통과 ABCD와 암호 다음 서버는 이러한 매개 변수를 사용하고 SQL 명령을 준비하고 마이크로 소프트 데이터베이스 -

select password from UserInformationTable where userid = 'abcd'; 

반환 값으로 발사 주어진 패스워드 패스와 비교되어 결과가 클라이언트로 보내진다.

내가 성공적으로 다음과 같은 방법을 사용하여 시스템에 침입 -

사용자는 사용자 ID를 입력 - <abcd1 or drop table UserInformationTable>. 이 작업이 완료되고 내 전체 UserInformationTable이 삭제되었습니다.

해킹 문제를 해결할 수있는 적절한 방법이 있습니까? 한 가지 방법은 사용자 ID에서 '또는'하위 문자열을 감지하는 것이지만 매우 좋지 않습니다. 내가 아니오를 제한 할 수있는 방법이 있습니까? SQL에서 문에서 쿼리의?

감사 및 감사 Radz

+1

실제로 매개 변수를 사용하거나 단순히 쿼리 문자열을 연결하고 있습니까? 또한이 MySQL 또는 SQL Server가 있으며 사용중인 언어는 무엇입니까? –

+1

SQL 인젝션에 대해 읽어보십시오. 그런 다음 평문 암호를 저장하는 것이 왜 나쁜지 읽어보십시오. 그런 다음 오늘날의 CodingHorror.com에서 인증을 위해 타사를 활용하는 것이 좋은 방법인지 읽어보십시오. – Joe

+0

SqlParameters [helplink] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx)를 사용해야합니다. – Raghuveer

답변

0

이것은 famous "Bobby Tables" cartoon에 도시 된 SQL 인젝션 문제이다.

Here은 MS SQL 용으로 수정하는 방법에 대한 정보입니다. 특히 @ Rook의 대답을 읽으십시오.

0

SQL 쿼리의 매개 변수를 사용하십시오. 그들은 자동으로 이것을 방지합니다. C#에서 이런 식으로 뭔가 :

SqlCommand comm = new SqlCommand(conn); 
comm.CommandText = "SELECT * FROM foo WHERE bar = @id"; 
comm.CommandType = CommandType.Text; 

SqlParameter param = new SqlParameter("@id", DbType.Int64); 
param.Value = 3; // The actual value that replaces @id 

comm.Parameters.Add(param); 

// ... 

이 C#을 적용뿐만 아니라, 기본적으로 모든 현대적인 DB 시스템과 언어가 매개 변수가있는 쿼리 <을 지원하는 -을 구글.

둘째, 첫 번째 쿼리가 변경 될 수 있습니다

그럼 그냥 그 다음 사용자가 잘못된 암호를 입력, 0의 경우, 반환있어 행 수를 계산

SELECT userid FROM users WHERE username = 'foo' AND password = 'bar' 
.

0

두 가지 문제가 있습니다.

  1. 다른 사용자가 설명한대로 SQL 주입 공격을받을 수 있습니다. 입력 문제를 해결하고 매개 변수화 된 쿼리를 사용하여 문제를 해결하십시오.

  2. 일반 텍스트 암호를 저장하거나 전송해서는 안됩니다. 왜? 이 이야기는 Slashdot에 있습니다. 이 문제의 해결 방법은 단방향 암호화를 사용하여 데이터베이스에 저장할 암호 해시를 만드는 것입니다. 사용자가 로그인을 시도 할 때 자신이 제공 한 암호에 동일한 암호화를 사용하고 데이터베이스를 검색하여 동일한 사용자 ID와 암호 해시가있는 행이 있는지 확인하십시오.

관련 문제