2008-10-19 4 views
3

불행히도 사용자가 MySQL WHERE 절에서 사용할 정규식을 제공해야하는 사이트를 만들고 있습니다. 물론 SQL 인젝션을 막기 위해 사용자 입력의 유효성을 검사해야합니다. 이 사이트는 PHP에서 만들어지고, 내 정규식 확인하려면 다음 정규식을 사용 : 이것은사용자 생성 SQL 정규식에서 SQL 삽입 피하기

/^([^\\\\\']|\\\.)*$/ 

때문에 정규 표현식에를 처리 PHP의 방법을 이중 이스케이프를. 그것이 작동해야하는 방식은 이스케이프 처리되지 않은 작은 따옴표없이 안전한 정규 표현식 만 일치시키는 것입니다. 그러나 대부분 독학을하고 있기 때문에 이것이 안전한 방법인지 알고 싶습니다.

답변

-2

이 reg 표현식을 표시하기위한 목적이라면 대부분의 프로그램은 간단히 Html 값을 인코딩하고 DB에 저장 한 다음 디코드를 취소합니다. 다시 한 번 표시 목적으로 만 사용할 수 있습니다. 제출 된 reg exp를 사용해야하는 경우에는 작동하지 않습니다.

또한 주입하는 사람이 SQL을 쓰는 방법이 있습니다. varbinary로 변환 한 후 이전에 쿼리 한 쿼리의 기본 64 표현과 함께 exec 명령을 제출하는 방법이 있습니다.

+1

이 질문에 대한 답변이 전혀 표시되지 않습니다. 당신은 명확히 할 수 있습니까? – ysth

2

문자열을 mysql_escape_string 또는 mysql_real_escape_string에 전달해야합니다.

오래된 정규식을 수락하는 것을 조심해야합니다. 일부는 오랫동안 실행할 수 있으며 DB 서버를 묶을 것입니다. Pattern Syntax에서

:

이 무한 반복을 중첩 포함 패턴의 조심하십시오. 일치하지 않는 문자열에 적용하면 실행 시간이 걸릴 수 있습니다. 에게 패턴 조각 (A +) *을 고려

이 33 개 가지 방법으로 "AAAA"와 일치 할 수 있으며,이 숫자가 매우 빠르게 문자열이 길어지면 증가한다.

+0

-하지만 mysql_escape_string을 사용하면 정규식을 변경하지 않겠습니까? 예. 사용자는 일련의 숫자와 일치하도록

/\d+/
을 입력하고 대신 백 슬래시와 일련의 "d"가 뒤 따르는 것으로 끝납니다. 그래서 내가 처음에 자기 자신을 굴리고 싶었습니다. – Kalleguld

+0

상황은 준비된 진술을 요구합니다. 사용자가 무엇을 입력하든 DB 1 : 1로 이동하며 SQL 주입에는 깨지지 않습니다. – Tomalak

9

준비된 문을 사용하면 SQL 삽입이 불가능합니다. 항상 준비된 문장을 사용해야합니다.

Roborg는 값 비싼 regexes에 대해 훌륭한 점을 제시합니다.

+0

그 두 번째. 또한 코드를 훨씬 쉽게 읽을 수 있습니다. – Tomalak

+0

또한 prepared statement 매개 변수를 사용하는 것이 좋지만 SQL 문에서 리터럴 값 대신 사용할 수 있습니다. 응용 프로그램 변수를 사용하여 조건부로 쿼리를 작성해야하는 경우 보간 작업을 수행해야합니다. 따라서 SQL 주입은 여전히 ​​가능합니다. –

+0

조건부 쿼리 작성에 대한 귀하의 의미를 잘 모르겠습니다. 필자는 사용자가 입력 한 값에 대한 SQL 자리 표시 자/매개 변수를 사용하여 알려진 안전한 응용 프로그램 데이터와 사용자 입력 데이터를 혼합하여 항상 동적 쿼리를 작성하며 마지막으로 보간해야 할 시간을 기억하지 못합니다. –