문제

저에게 조언을 해주시겠습니까? 나는 질문을 검색했지만 내 것과 비슷한 것을 찾지 못했습니다.

SQL 쿼리에서 사용하려는 경우 사용자 입력을 자동으로 탈출하는 방법은 무엇입니까? 나는 내 코드에서 좋아하지 않는다.

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

mysql_real_escape_string을 수행하는 Escape 메소드가있는 데이터베이스 클래스가 있다고 가정합니다.

그러나 SQL 쿼리에서 자동 이스케이프를 설정할 수는 없습니다. 삽입 쿼리를 중단하기 때문입니다.

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

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

'xxx '로 만듭니다. 잘못된 것입니다.

마지막으로하고 싶은 것은 시스템을 더욱 복잡하게 만들기 때문에 매개 변수화 된 진술을 만드는 것입니다. 다른 것이 남지 않을 때이 옵션을 고려할 것입니다.

간단히 말해서 - 전체 쿼리와 함께 작동하고 값 만 탈출하는 스마트 자동 에스케이프를 만드는 방법은 무엇입니까?

도움이 되었습니까?

해결책

실제로, 당신이 고려해야 할 유일한 것은 (우리는 여기서 테스트 프로젝트에 대해 말하지 않고) 매개 변수화 된 진술을 사용하는 것입니다. 이것은 유일한 방법입니다 (SQL Synax가 물론 허용 할 때). 제대로 완료하면 시스템은 시스템을 더 복잡하게 만들지 않지만 ~ 할 것이다 더 강력하게 만드십시오.

다른 팁

죄송합니다. 아무것도 자동 할 수 없습니다. 문자열을 연결할 때, 당신은 항상 캐릭터를 피하는 문제가있을 것입니다. 이것은 당신이 한 번 '해결'할 수있는 것이 아니며 다시는 생각할 필요가 없습니다.

당신이하는 경우 :

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

그런 다음 쿼리 문자열에는 문자열 리터럴의 실제 apostrophes 인 Apostrophes와 문자열 구분자 인 Apostrophes가 포함되어 있습니다.

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

하나는 탈출해야한다. 다른 하나는 안됩니다. 어느 것이 무엇인지 알 수 있습니까? 당신은 그 정보가 영원히 손실됩니다. 대신 말해야합니다.

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

(또는 다른 탈출 기능이 사용중인 데이터베이스에 더 적합한 사람.)

못생긴? 그럼 당연하지. 그렇기 때문에 대신 매개 변수화 된 쿼리를 사용합니다. 이것은 모든 문제와 함께 문자열 연결에서 벗어납니다.

문자열 연결은 쉽게 보입니다. 사람들은 자신이 문자열을 함께 이해한다고 생각합니다. 그러나 실제로는 그렇지 않습니다.

이 방법을 사용합니다.

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

여기 $db->set() 메소드는 자동으로 값을 피합니다 (예 : 두 번째 인수).

PHP 5를 사용하면 다음을 수행 할 수 있습니다.

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

마지막으로하고 싶은 것은 시스템을 더욱 복잡하게 만들기 때문에 매개 변수화 된 진술을 만드는 것입니다. 다른 것이 남지 않을 때이 옵션을 고려할 것입니다.

매개 변수화 된 쿼리가 "더 복잡하다"는 주장을 설명하기 위해주의해야합니까? 외부 데이터를 쿼리로 연결하지 않습니다. 항상 - 그리고 그것은 세상에서 가장 간단한 일이며, 탈출 기술보다 "방탄"에 훨씬 더 가깝습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top