[SQL] 이 코드 방지 SQL 주입합니까?
SQL이 코드 방지 SQL 주입합니까?
나는 기존의 데이터 공급자를 분석하는 계약을 체결했고 다음 코드에 결함이 알고; 그러나 그것이 얼마나 나쁜 점을 지적하기 위해, 나는 그것이 SQL 주입에 취약하다는 것을 증명해야합니다.
무엇 "키"매개 변수 PrepareString 기능을 깨고 나를 DROP 문을 실행할 수 있습니다?
Public Shared Function GetRecord(ByVal Key As String) As Record
Dim Sql As New StringBuilder()
With Sql
.Append("SELECT * FROM TableName")
If String.IsNullOrEmpty(Agency) Then
.Append(" ORDER BY DateAdded")
Else
.Append(" WHERE Key = '")
.Append(PrepareString(Key))
.Append("'")
End If
End With
Return ExecuteQuery(Sql.ToString())
End Function
Public Shared Function PrepareString(ByVal Value As String) As String
Return Value.Replace("''", "'") _
.Replace("'", "''") _
.Replace("`", "''") _
.Replace("´", "''") _
.Replace("--", "")
End Function
해결법
-
==============================
1.직접적인 질문에 대한 대답에서이 코드 방지 SQL 주입을합니까 : 아니오
직접적인 질문에 대한 대답에서이 코드 방지 SQL 주입을합니까 : 아니오
여기 증거입니다 - PrepareString 방법을 통해이 문자열을 밀어 :
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-" Dim output = PrepareString(input) Console.WriteLine(input) Console.WriteLine(output)
난 당신이 데이터베이스에서 레코드를 완전히 준비된 SQL 문자열을 반환하는 대신 얻을 게시 GetRecord 방법을 수정 :
Console.WriteLine(GetRecord(output))
그리고 이것은 출력
Input = ; Drop Table TableName; -- Output = '; Drop Table TableName; -- Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
코드의 1 여분의 줄을 추가합니다 :
My.Computer.Clipboard.SetText(input)
그리고 당신은 당신이 당신의 SQL 주입을 완료하려면 웹 사이트에 입력 필드에 붙여 클립 보드에 복사 권한을 필요로하는 문자열을 가지고 :
'; Drop Table TableName; - -
[당신이 당신의 출력을 생성하는 코드 예제를 수행해야하므로, 제어 문자에 StackOverflow에 의해 게시물 출력에서 생략되었음을 주목]
PrepareString 메소드가 실행 된 후에는 동일한 출력해야합니다 - 대하을 (8) ASCII 코드는 문자열을 닫습니다 당신이 광산에 추가하고 있다는 여분을 " '"제거 백 스페이스이며, 다음 난 마지막에 내가 원하는대로 추가 할 무료. 귀하의 PrepareString 내 표시되지 않습니다 - 공간을 제거하기 위해 백 스페이스 문자로 - - 내가 실제로 사용하고 있기 때문이다.
당신이있는 거 건물은 다음 내 드롭 표 문이 방해받지 실행하고 신속하게 쿼리의 나머지 부분을 무시하는 결과 SQL 코드입니다.
이것에 대해 재미있는 것은 당신이 당신이 발명 할 수있는 모든 문자 확인 바이 패스 기본적으로 인쇄 할 수없는 문자를 사용할 수 있다는 것입니다. (당신이 무엇을 요구하지 않지만이를 방지하는 가장 좋은 경로입니다) 매개 변수화 된 쿼리를 사용하는 것이 가장 안전합니다 그렇게.
-
==============================
2.당신의 의심의 질문에 대답하기 위해, 더는 작동하지 않을 것입니다.
당신의 의심의 질문에 대답하기 위해, 더는 작동하지 않을 것입니다.
.Replace ( "``" " ''")와 합법적 인 쿼리를 방해하는 '' '
.Replace ( " '", "' '")' ''합법적 인 쿼리를 방지 할 수
.Replace는 ( "-", "")와 합법적 인 쿼리를 방지 할 수 '-'그들에
.Replace ( " '", "'") 잘못 그들 '' ''합법적 인 쿼리를 수정하는 것
등등.
또한, 이스케이프 문자의 전체 세트는 하나 RDBMS마다 다를 수 있습니다. 매개 변수화는 FTW 쿼리합니다.
-
==============================
3.나는 당신이 단지 '와'대체 할 경우는 설사 해킹 생각합니다. 나는 그러나 나는 확실하지 않다, 가능성이 휴식 할 수있는 이스케이프 인용 문자를 변경하는 것이 가능하다는 것을 들었습니다. 난 당신이 안전하지만 생각합니다.
나는 당신이 단지 '와'대체 할 경우는 설사 해킹 생각합니다. 나는 그러나 나는 확실하지 않다, 가능성이 휴식 할 수있는 이스케이프 인용 문자를 변경하는 것이 가능하다는 것을 들었습니다. 난 당신이 안전하지만 생각합니다.
-
==============================
4.나는 그것이 (적어도 SQL 서버에서) 안전 생각하고, 나는 또한 당신이 실제로 S = s.Replace을해야 할 유일한 것은 생각 ( " '", "' '"). 물론 당신은 매개 변수가있는 쿼리를 사용해야합니다,하지만 당신은 이미 알고있다.
나는 그것이 (적어도 SQL 서버에서) 안전 생각하고, 나는 또한 당신이 실제로 S = s.Replace을해야 할 유일한 것은 생각 ( " '", "' '"). 물론 당신은 매개 변수가있는 쿼리를 사용해야합니다,하지만 당신은 이미 알고있다.
-
==============================
5.대부분의 당신이 밖으로 볼 필요가 물건이 MSDN 문서 커버 (나는 그것이 SQL 주입에 관한 한 모든 말을 두려워).
대부분의 당신이 밖으로 볼 필요가 물건이 MSDN 문서 커버 (나는 그것이 SQL 주입에 관한 한 모든 말을 두려워).
하지만 매개 변수 매개 변수 매개 변수의 모든 사람이 다른 사람의 감정을 에코합니다.
귀하의 예를 들어 같은 몇몇 개는 [편집 :이 업데이트]은 :
당신이 확인하고 싶은 기사에 따르면 :
-
==============================
6.당신은 SQL 이스케이프의 자신의 버전을 구현하기 위해 블랙리스트 문자에 노력하고 있습니다. (즉, 빠르게 기존 앱을 고정) SQL 이스케이프는 반드시 나쁜 선택이 아니다하지만 피할 취약점 바로 일을해야 -이 URL을 검토 건의 할 것입니다.
당신은 SQL 이스케이프의 자신의 버전을 구현하기 위해 블랙리스트 문자에 노력하고 있습니다. (즉, 빠르게 기존 앱을 고정) SQL 이스케이프는 반드시 나쁜 선택이 아니다하지만 피할 취약점 바로 일을해야 -이 URL을 검토 건의 할 것입니다.
저자가 도움이 기능을 제한없이 취약점을하지 않는 것이 제안을 제공 곳 SQL Server의 탈출을 위해 다른 페이지에 그 URL 링크.
도움이된다면, 기사가 너무 중괄호를 탈출 제안 (I 대괄호 그들에게 전화 -하지만 []).
-
==============================
7.테이블에서 선택 *; 당신은 당신의 코드를 사용하려고하면 어떤 사람은 키 (전달할 수 및 그들이 원하는 무엇을 적 테이블의 목록을 가져옵니다.
테이블에서 선택 *; 당신은 당신의 코드를 사용하려고하면 어떤 사람은 키 (전달할 수 및 그들이 원하는 무엇을 적 테이블의 목록을 가져옵니다.
당신의 코드에서 당신은 당신이 T-SQL 문을 종료하고 다른 하나를 시작할 수 있습니다 세미콜론 확인하지.
나는 매개 변수가있는 쿼리와 함께 갈 것입니다.
from https://stackoverflow.com/questions/1800013/does-this-code-prevent-sql-injection by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 쿼리 날짜 식 느린 실행되지만 빠른 문자열 리터럴로 (0) | 2020.05.04 |
---|---|
[SQL] SQL 서버 (TSQL) -이 병렬로 EXEC 문에 수 있습니까? (0) | 2020.05.04 |
[SQL] 그것은 ADO.NET SQL 매개 변수로 ID의 컬렉션을 보낼 수 있습니까? (0) | 2020.05.04 |
[SQL] 내부는 SQL 서버에 행 번호에 가입 할 방법 (0) | 2020.05.04 |
[SQL] MYSQL에서 하위 쿼리에서 LIMIT 키워드를 사용하는 대체 (0) | 2020.05.04 |