2009-04-08 3 views
1

제게 조언 해 주시겠습니까? 나는 질문을 검색했으나 내 것과 비슷한 것을 발견하지 못했습니다.사용자 제공 입력 SQL 이스케이프

SQL 쿼리에서 사용할 사용자 입력을 자동으로 이스케이프 처리하도록하려면 어떻게해야합니까? 나는

을 mysql_real_escape_string를 수행 탈출 방법 데이터베이스 클래스가 난 가정

$var_x = $DB->Escape($_POST['var_x']); 
$another_var = $DB->Escape($_POST['another_var']); 
$some_string = $DB->Escape($_POST['some_string']); 
... 

처럼 뭔가 가득 내 코드에서 좋아하지 않는하지만 난뿐만 아니라 SQL 쿼리에 자동 탈출을 설정할 수 없습니다 삽입 쿼리가 깨지기 때문에 :

function Exec($sql){ 
    $result = mysql_query($this->Escape($sql)); 
} 

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'"); 

이렇게하면 'xxx \'가됩니다. 잘못된 것입니다.

마지막으로해야 할 일은 매개 변수가있는 명령문을 작성하는 것입니다. 시스템이 더 복잡해지기 때문입니다. 다른 옵션은 남지 않을 때이 옵션을 고려할 것입니다.

요약하면 전체 쿼리와 함께 작동하고 값만 이스케이프 처리하는 스마트 자동 이스케이프를 만드는 방법은 무엇입니까?

답변

4

사실, 고려해야 할 유일한 것 (여기서는 테스트 프로젝트에 대해 분명히 말하지 않습니다)은 매개 변수화 된 문을 사용하는 것입니다. 이것이 유일한 방법입니다 (SQL synax가 허용하는 경우). 올바르게 수행하면 이들이 시스템을 더 복잡하게 만들지는 않지만 이됩니다.

$db->set('name',$name); 
$db->set('title',$title); 
$db->insert('users'); 

가 여기에 $db->set() 방법은 자동으로 (즉 제 2 인수) 값을 탈출 :

+0

감사합니다. –

1

나는이 방법을 사용합니다.

PHP 5로, 당신은이 작업을 수행 할 수 있습니다

$db->set('name',$name)->set('title',$title)->insert('users'); 
2

죄송합니다, 당신은 자동 아무것도 할 수 없습니다. 문자열을 연결할 때 문자가 항상 이스케이프 처리됩니다. 이것은 한 번 '해결할 수있는'것이 아니며 다시 생각할 필요가 없습니다.

당신이 할 경우

$a= "a'b"; 
$query= "SELECT * FROM things WHERE name='$a'"; 

그런 다음 쿼리 문자열이 문자열 구분 기호 둘 문자열 리터럴에서 실제 아포스트로피있는 작은 따옴표, 아포스트로피 포함

SELECT * FROM things WHERE name='a'b' 

하나는 탈출 할 필요가; 다른 사람은해서는 안됩니다. 어느 것이 어느 것을 말할 수 있습니까? 그 정보는 영원히 잃어 버릴 수 없습니다. 대신 말을해야합니다. (또는 사용중인 데이터베이스에 더 적합한 다른 쪽 탈출 기능)

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'"; 

미운? 그럼 당연하지. 그래서 우리는 매개 변수화 된 쿼리를 대신 사용합니다. 이것은 모든 불행과 함께 문자열 결합에서 벗어납니다.

문자열 연결이 쉬워 보입니다. 사람들은 줄을 함께 이해한다고 생각합니다. 그러나 정말로, 그들은하지 않습니다.이 는 복잡한 시스템이 더 할 것 같은 내가하고 싶은

0

마지막 것은, 매개 변수가 진술을 할 수 있습니다. 다른 옵션은 남지 않을 때이 옵션을 고려할 것입니다.

매개 변수화 된 쿼리가 "더 복잡합니다"라는 주장을주의해서 설명합니까? 외부 데이터를 쿼리로 연결하지 않습니다. 입니다.이 기술은 탈출 기법보다 훨씬 방탄 거리는 것은 물론 세계에서 가장 간단한 것입니다.

관련 문제