2009-04-27 6 views
0

메신저 내 모든 입력을 '깨끗하게'하는 영리한 방법을 설정하는 방법에 대해 궁금해합니다. 즉, 모든 스크립트의 시작 부분에서 실행되는 절차입니다. 내 스크립트의 상단에,사용자 입력을 효율적이고 안정적으로 처리 할 수 ​​있습니까?

in-mynumber 
tx-name 
ph-phone 
em-email 

그래서 : 나는 예를 들어, 입력의 종류를 식별하기 위해 모든 입력의 시작에 2 편지 접두사를 추가, 그 작업을 수행하는 클래스를 만들고, 생각 난 그냥 (예를 들어) 함수를 실행 : 내가 각각 $ _GET과 $ _POST의 깨끗한 데이터 cPost을, 다른 두 배열을 생성 $ cGet 및 $ 것이다 ..so

function cleanInputs(){ 
    foreach($_GET AS $taintedKey => $taintedValue){ 
     $prefix = substr($taintedKey, 0, 2); 
     switch($prefix){ 
      case 'in': 
       //I assume this input is an integer 
       $cGet[$taintedKey] = intval($taintedValue); 
       break; 
      case 'tx': 
       //i assume this input is a normal text 
       //can contains onely letters, numbers and few symbols 
       if(preg_match($regExp, $taintedValue)){ 
        $cGet[$taintedKey] = $taintedValue; 
       }else{ 
        $cGet[$taintedKey] = false; 
       } 
       break; 
      case 'em': 
       //i assume this input is a valid email 
       if(preg_match('/^[a-zA-Z0-9-_.][email protected][a-zA-Z0-9-_.]+.[a-zA-Z]{2,4}$/', $taintedValue)){ 
        $cGet[$taintedKey] = $taintedValue; 
       }else{ 
        $cGet[$taintedKey] = false; 
       } 
       break; 
     } 
    } 
} 

, 내 스크립트 내가 그 배열을 사용하기 위해 $ _GET/$ _ POST를 완전히 잊어 버려야한다. 나는 두 번째 접두어를 추가하여 입력의 최대 길이를 결정한다고 생각한다. 예 : tx-25-이름 ..하지만 그것에 대해 꽤 확신하지 못합니다. 만약 내가이 방법을 택한다면 아마도 OOP 방식이 더 좋을 것입니다.

당신은 어떻게 생각하십니까? 사용하는 좋은 방법이라고 생각하십니까?

내가 실제로 볼 수있는 부정적인 점 (나는 아직 그 방법으로 사용하지 않았다. 오늘 아침에 궁금하다.) 1. 내 응용 프로그램을 원하지 않으면 접두사와 절차가 많이 있어야합니다. 매우 제한적인; 2. 내 보낸 변수의 이름은 조금 길어질 것입니다. (문제는 3 ~ 6 개의 문자로 이루어져야합니다.)

정말 감사드립니다!

편집 :

임 바퀴를 재발견하는 triyn하지, 내 게시물 입력 살균에 SISTEM에 대해 was't, 그러나 그것을 할 수있는 방법에 관한 것입니다. htmlpurifier를 사용하여 html 데이터에서 xss 삽입 가능성을 높이고 물론 매개 변수화 된 쿼리를 사용합니다. Im은 입력에 의한 입력을 더 잘 받아들이는 것이 더 쉬운 것인지 궁금해하고 있습니다. 또는 시작 부분에서 모든 것을 위생적으로 처리하고 스크립트의 나머지 부분을 깨끗이 처리한다고 생각하십시오. 내가 thougt 방법은 태양 아래서 기적과 새로운 것은 아니지만, 나는 측면에서 유용한 정보가 될 수있는 형식으로하지 않으면 입력을 잘라 낸다고 생각합니다 ...

왜 ' 이름 '필드는 문자와 아포스트로피 문자 만 포함해야합니다. 문자 또는 어포 스트로피가 아닌 모든 것을 제거하고 마지막 것에 슬래시를 추가하고 매개 변수화 된 쿼리를 실행하십시오. 이메일을 aspect하면, 이메일이 아닌 모든 것을 삭제하면됩니다.

+0

나는 본질적으로 당신의 접근 방식에 잘못된 것을 볼 수 없으며, 좋은 생각이라고 생각합니다. – stefs

+0

또한, 나는 당신이 술에 취해 있다고 생각합니다. 하지만 나는 프로그래머이기도하다. – stefs

답변

0

아이디어 자체는 훌륭하지만 정말 유용 할 지 궁금합니다.

SQL 인젝션과 HTML 인젝션은 다른 방법으로 보호 될 수 있습니다.SQL 인젝션은 매개 변수화 된 쿼리 (요일과 시간대에 필수)에 의해 방지됩니다. HTML 삽입은 문자열을 출력하기 전에 바로 이라고해야하는 htmlspecialchars() 메서드로 막을 수 있습니다. 인코딩 된 문자열을 DB에 저장하지 마십시오. 또는 인코딩 된 문자열을받은 즉시 인코딩 할 수 있습니다. 그들과 함께 일하는 것은 나중에 지옥이 될 것입니다.

이 두 가지 공격 이외에 어떤 방법을 사용합니까? 음, 숫자, 전화 번호, 이메일, 이름 및 날짜와 같은 것들에 대한 몇 가지 정규식을 수행 할 수 있습니다. 그러나 그것은 그것에 관한 것입니다. 불행히도 그것은 여러분이해야 할 모든 유효성 검사의 일부일뿐입니다. 다른 일반적인 경우에는 입력을 교차 검사 (종료일 이전 시작일)하고 값이 허용 된 미리 정의 된 값 목록에 있는지 확인하는 것입니다 (예 : <select> 요소의 경우). 또한 응용 프로그램에서 무한대의 사용자 지정 유효성 검사 단계가 있습니다. "제네릭 형식 유효성 검사"및 "사용자 지정 규칙 유효성 검사"에서 모든 유효성 검사를 분할하는 것이 가치가 있습니까? 나는 모른다. 혹시. 아니면 아마도 이것은 더 큰 난장판이 될 것입니다.

+0

동의. 나는 폼 입력 이름에 문자열, 정수 또는 부울에 대해 예상되는 입력 유형 즉, s, i, b를 접두어로 붙이는 경향이 있습니다. 그것은 정말로 어렵고 빠른 예방 조치 이상의 회고록 보좌관입니다. –

0

무엇을하려고합니까? 데이터를 데이터베이스에 저장하기 위해 입력을 살균해야하는 경우 매개 변수가있는 쿼리보다 나은 것은 아닙니다.

예를 들어 this을 참조하십시오.

+0

어느 것이? (매개 변수화 된 쿼리는 ...) – Svish

+0

매개 변수가있는 쿼리는 다음과 같이 구성됩니다. ExecuteQuery ("INSERT INTO MyTable (Field1, Field2) VALUES (?,?)", $ Param1, $ Param2); 아이디어는 쿼리 문자열에 나중에 나오는 매개 변수에 일치하는 일부 마커 (예 : 질문 기호)가 포함되어 있다는 것입니다. 쿼리는 서버에 보내지며 모든 물음표로 구문 분석됩니다. 실행될 때 서버는 쿼리 *에서 매개 변수 값을 별도로 제공받습니다. 주입의 위험성은 전혀 없습니다. –

+0

이 작업을 수행하는 정확한 구문은 다른 DB 서버마다 다릅니다. MySQL의 경우 여기에서 예제를 볼 수 있습니다. http://php.net/manual/en/mysqli.prepare.php –

2

입력을 이미 소실 한 많은 사람이 well-made PHP tested classes입니다. 왜 다른 것을 만들까요? 게다가, 입력을 살균하는 것은 단지 데이터 유형을 검증하는 것이 아닙니다. SQL 주입, xss 공격 등을 검사하는 것을 의미합니다.

+0

+1하고 올바른 기존 코드를 추천합니다. 알려진 익스플로잇 벡터를 명시 적으로 확인하는 경우에는 문제가 발생합니다. –

+0

바퀴를 재발 명하기 위해 triyn을 사용하지 마십시오. 내 게시물은 입력을 살생시키기위한 시스템에 관한 것이 아니지만이를 수행하는 절차에 관한 것입니다. htmlpurifier를 사용하여 html 데이터에서 xss 삽입 가능성을 높이고 물론 매개 변수화 된 쿼리를 사용합니다. Im은 단지 입력으로 입력을 받아들이는 것이 더 좋을지 궁금하거나 시작 부분에서 모두 입력을 더 잘 처리하고 스크립트의 나머지 부분을 정리하는 것이 좋다고 생각합니다. – Strae

관련 문제