pdostatement :: FetchColumn은 PDO가 제공하는 메소드로, 쿼리 결과 세트에서 데이터 열을 얻는 데 특별히 사용됩니다. 다른 페치 방법과 달리 FetchColumn은 쿼리 결과의 첫 번째 열만 리턴하므로 Select Count (*) 와 같은 특정 쿼리를 처리하거나 단일 필드를 쿼리 할 때 유용합니다.
SQL 쿼리를 실행할 때 사용자 입력이 SQL 문에 직접 내장되어 있으면 공격자는 특수 제작 된 입력을 통해 쿼리의 원래 의도를 우회하여 SQL 주입 문제를 초래할 수 있습니다. PDO가 제공하는 파라미터 바인딩 메커니즘을 사용하면이 위험을 방지 할 수 있습니다.
SQL 주입을 효과적으로 방지하기 위해 PDO의 준비된 명령문 및 매개 변수 바인딩을 올바르게 사용하는 것이 중요합니다. SQL 주입 문제는 사용자의 입력을 SQL 쿼리로 SQL 문으로 직접 분류하는 대신 SQL 쿼리에 매개 변수로 전달하여 피할 수 있습니다.
다음은 pdostatement :: fetchcolumn 및 preprocessing 문을 사용하여 보안 쿼리를 실행하는 방법을 보여주는 예입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// 데이터베이스 연결을 만듭니다</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// 사용자 입력</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>];
</span><span><span class="hljs-comment">// 전처리 진술을 사용하십시오,바인딩 매개 변수</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT COUNT(*) FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-comment">// 쿼리를 실행하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// 쿼리 결과의 첫 번째 열을 가져옵니다</span></span><span>
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchColumn</span></span><span>();
</span><span><span class="hljs-comment">// 출력 쿼리 결과</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"사용자 '<span class="hljs-subst">$username</span></span></span><span>' 계정 수는입니다: " . </span><span><span class="hljs-variable">$count</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'연결이 실패했습니다: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
위의 코드에서는 SQL 주입을 피하기 위해 PDO 사전 처리 문을 사용합니다.
데이터베이스 연결 : 새로운 PDO를 통해 데이터베이스 연결을 생성하고 모든 오류를 포착하기 위해 오류 모드를 예외로 설정했습니다.
전처리 명세서 : 준비 방법을 사용하여 SQL 쿼리가 사용자 입력과 분리되도록 SQL 쿼리를 구축하여 SQL의 직접 스 플라이 싱으로 인한 주입 위험을 방지합니다.
바인딩 매개 변수 : BindParam 메소드를 통해 사용자 이름 매개 변수를 사용자 $ username 에 의해 입력 한 값에 바인딩합니다. 이를 통해 사용자가 입력 한 값이 안전하게 처리되고 SQL 쿼리에 직접 포함되지 않도록합니다.
결과를 얻으십시오 : FetchColumn을 사용하여 전체 쿼리 결과 세트를 반환하는 대신 쿼리 결과의 첫 번째 열 (이 예제에서 사용자 계정 수)을 가져 오므로 코드가 더 간결하고 효율적입니다.
SQL 스티치 피하십시오 : 전처리 명령문을 사용하면 사용자 입력을 SQL 쿼리에 직접 스 플라이 싱하지 않습니다. 이것은 SQL 주입의 주요 원인입니다. 사용자가 어떤 악성 콘텐츠에 입력하든 쿼리의 일부가 아니라 올바르게 탈출하여 매개 변수로 전달됩니다.
파라미터 바인딩 : BindParam 또는 BindValue 바인딩 매개 변수를 사용하여 사용자가 입력 한 데이터가 안전하게 처리되도록합니다. PDO는 입력 값의 탈출과 데이터 유형의 전환을 자동으로 처리하여 SQL 주입 공격자가 영리한 입력을 통해 SQL 문을 조작 할 수있는 가능성을 피합니다.
단순화 된 코드 : FetchColumn 방법은 불필요한 결과 세트 처리를 피하고 코드를보다 간결하게 만드는 단일 열에서 데이터를 얻는 데 특별히 사용됩니다.
관련 태그:
PDOStatement SQL