2014-02-25 3 views
-2

아래 예제 코드를 사용하여이 코드를 간단하고 간단하게 만들려고합니다. 이 문제가 어떤 형태의 SQL 인젝션에도 문제가되는 것을 보시겠습니까?SQL 삽입 방지 - 단일 행 방법?

$tmpVar = isset($_POST['somePostVar']) ? pg_escape_string(utf8_encode(preg_replace('/[^a-z0-9_]+/i', '', filter_var($_POST['somePostVar'], FILTER_SANITIZE_STRING)))) : 'error'; 

나는 네 가지 방법을 모두 사용하여 죽이거나/중복되는 것을 알고 있지만 나는 여전히 미안한 것보다 안전 할 것입니다.

이 결과 변수는

SELECT * FROM table_name WHERE someCol='$tmpVar' 
이제

내가 그와 유래에 큰 포스터를없는 동안 ... 매일 브라우저를 이해 DO, 주위에이 같은 중복 된 질문이 알고로서 사용되는 ... 내가 사용

가 SQL 인젝션의 한 형태로 쉽게 파괴 될 수 있습니다

그래서 pg_escape_string, utf8_encode, preg_replace이다과 filter_var를 사용하여 ...이 문자열에만 밑줄과 영숫자로 제한됩니다 ..

utg8_encode도 pg_escape_string을 사용할 때 postgresql에 문제가있을 수 있기 때문에 여기에 있습니다. 그래서 그들은이 경우에 손을 맞잡습니다.

+0

각 기능이 무엇인지 알고 일부는 문자열을 과장 할 수도 있음을 이해하십시오.하지만 단순한 수정이 항상 쉬운 것처럼 생각할 필요가없는 상황이 있습니다 ... 질문이있었습니다. 이 특정 문자열은 여전히 ​​주입과 함께 깨진 것입니다 ... – Mayhem

답변

4

왜이 모든 것을 엉망으로 만들겠습니까?

다른 모든 사람들과 마찬가지로 매개 변수가있는 쿼리를 사용하십시오. PHP's manual on SQL injectionbobby-tables.com을 참조하십시오.

당신은 을 이해해야합니다.이 문제는 더 많은 무작위로 이해되는 것들을 더 많이 던지지 말아야합니다. 예를 들어 filter_var(..., FILTER_SANITIZE_STRING)은 SQL과 함께 사용하는 것이 완전히 잘못되었습니다. the documentation for it을 본 후에 왜 그렇게 할 수 있습니까?

그리고 왜 텍스트 인코딩이 엉망이 되니? client_encoding이 맞으면 필요 없습니다.


당신은 대체 식별자, 또는 서버 측 쿼리 매개 변수를 사용할 수 없습니다 다른 것들과 같은 일을하는 경우는, 당신이 할 일은 그래서, 어떤 따옴표 더블 :

this "identifier" name 

이된다 :

"this ""identifier"" name" 

/SQL 표준. PHP는 편리한 기능인 pg_escape_identifier을 제공합니다.

마찬가지로, standard_conforming_strings (기본값)을 사용하면 매개 변수를 사용하지 않고 따옴표를 제공해야합니다 (예 : ALTER USER ... PASSWORD ... 및 다른 위치 Pg는 서버 측 매개 변수를 지원하지 않습니다. 그러나 PHP 드라이버는 여전히 클라이언트 측 매개 변수를 지원할 수 있으므로 보통 매개 변수화 된 쿼리를 사용할 수 있습니다. 그렇지 않은 경우 PHP pg_escape_literal을 사용하는 것이 좋습니다.

+0

당신은 pg_escape_string과 utf8 인코딩이있는 postgres db에서 발생할 수있는 문제에 관해 읽어야합니다. – Mayhem

+0

단순히 큰 따옴표를 추가하고 사용자가 조절할 수있는 쿼리를 안전한 것으로 만들기 위해 ... 안전하지 않다면 ... – Mayhem

+0

@Mayhem PHP가이 기능을 사용할 때 텍스트 인코딩을 변경해야하는 경우, 평소보다 깨 졌거나,'client_encoding'이 잘못 구성되었습니다. 이 문제를 합리적인 수준에서 문서화하는 적절한 보고서를보고 싶습니다. 추론을 설명하지 않는 문서에 대한 6 살짜리 주석을 언급하고 있다면, 그다지 진행될 것이 아니며, 대부분 'client_encoding'이 기본 PHP 인코딩과 일치하지 않는다고 제안합니다. –