2009-12-14 6 views
0

는 다음과 같은 시나리오를 생각해보십시오 : http://www.yourdomain.com/Default.aspx?p=2사용자 입력을 구문 분석하는 방법은 무엇입니까?

이제 우리는 당연히 쿼리 문자열 매개 변수 P 나던에 오류가 있는지 확인하고 싶습니다. 지금은이 설정이 : p는 정수인지 확인), p는

이 존재하는 경우) 확인)

1 페이지의 값

3) 대해 HTMLEncode 피 값

4에서 HTML을 필터링

5) db에 p의 정수가 있는지 확인하십시오.

5 단계는 성능 저하가 있지만 평소대로하는 방법입니다.

종류의 안부 마크

답변

0

. 대부분의 데이터 유형 (정수, 소수, 복식, 날짜 및 부울)에는 매우 엄격한 형식이 있습니다. 값이 엄격한 형식에서 구문 분석하지 않으면 오류입니다.

문자열 가끔은 이메일 주소 나 전화 번호와 같이 엄격한 형식입니다. 그것들은 간단한 regexp로 검증 될 수 있습니다. 적합 할 경우 사용하십시오. 그렇지 않으면 오류입니다.

그러나 대부분의 경우 문자열을 DB에 저장하고 나중에 다시 표시해야합니다. 이 경우 DB에 삽입 할 때 이스케이프 처리 (매개 변수화 된 쿼리를 사용할 경우 불필요 함) k 및 디스플레이에 렌더링 할 때 HTML 인코딩을 제외하고는 처리가 필요하지 않습니다.

이 방법을 사용하면 모든 데이터의 유효성을 검사 할 수 있으며 주사의 위험이 전혀 없습니다.

문자열에 대한 느슨한 형식의 드문 예외는 음 ... 희귀합니다. 나는 지금 당장 생각할 수 없다. 이를 위해 좀 더 광범위한 구문 분석 및 처리를 수행 할 수 있습니다.

추가 : 오, 예, ID (또는 다른 값)가 DB와 관련하여 유효한지 확인합니다. 당신이 바로하고 있지만, 당신이 항상 그것을 원한다면 생각하십시오. 어쨌든해야 할 일은 다른 쿼리에 넣을 수 있습니다. ID를 기반으로 데이터를 선택할 때처럼 명시 적으로 존재 하는지를 확인할 필요가 없습니다. 쿼리가 데이터를 반환 할 준비가되어 있어야합니다.

값을 전혀 사용할 필요가없는 경우가 있습니다. 간단히 무시할 수 있습니다.

물론 데이터를 삽입/업데이트 할 때와 같이 데이터가 존재하고 현재 컨텍스트에서 유효한지 여부를 명시 적으로 확인해야하는 경우가 있습니다.

3

의도가 데이터베이스에서 무언가를 검색 매개 변수를 사용하는 경우, 이유를 HTML 필터링하거나 인코딩? 데이터베이스에 저장하거나 프런트 엔드에 표시하는 것과는 다릅니다. DAL에 즉시 던지십시오. DAL은 그 ID로 레코드를 가져 오지 못했거나 ID를 파싱 할 수없는 경우 알려줄만큼 똑똑해야합니다.

3

내보기 : 일반적으로이 종류의 쿼리 문자열 매개 변수는 isn이 아닙니다. 실제로 사용자가 입력했지만 링크로 제출됩니다. 따라서 지나치게 복잡한 검증이 필요하지 않습니다.

그래서 저는 이것을 지속성/데이터 레이어로 전달하고 작업중인 시스템의 종류에 따라 일반적인 404 찾을 수 없음 또는 500 내부 서버 오류로 돌아 오는 오류를 처리합니다.

+0

동의. 난 그냥 페이지/컨트롤에 isnt null을 확인하는 다음 레이어를 통과하고 여기를 확인하는 경향이 있습니다. – Jammin

+1

아니면 왜 예외 처리가 그 일을하도록 내버려 두지 않겠습니까? 이것이 바로 그 때문입니다. –

1

어쨌든 입력을 정수로 변환하려면 2 단계와 3 단계는 필요하지 않습니다. 가지고있는 정보를 보려면 int.TryParse을 사용하십시오. 당신이 동적 SQL 문에 사용하거나 사이트

1

에 표시 될 문자열을 기대하는 경우에만 I 인코딩 및 HTML에 대한 입력을 테스트하는 것입니다 무엇에 대해 : 아주 간단한

int p = 0; 
if(!Int32.TryParse(Request.QueryString["p"], out p)) 
    throw new ArgumentOutOfRangeException("p"); 
관련 문제