PHP에서, 사용자 제출 HTML 양식 데이터를 처리 할 때, 특히 데이터베이스와 상호 작용하거나 HTML 컨텐츠를 생성 할 때 잠재적 인 보안 취약점을 방지하기 위해 데이터가 처리되고 탈출됩니다. 일반적인 탈출 방법 중 하나는 addcslashes 함수를 사용하는 것입니다. 그러나 양식 데이터를 처리 할 때 많은 개발자가 종종 AddCSlashes를 일반 솔루션으로 사용하고이를 직접 사용하여 사용자가 입력 한 데이터를 처리합니다. 그렇다면 AddcSlashes는 모든 경우에 효과가 있습니까? 다른 더 적합한 방법이 있습니까?
AddCSlashes 는 PHP의 문자열 함수로 문자열에서 특정 문자를 빠져 나옵니다. 그 기능은 문자열의 문자에 속하는 캐릭터를 지정된 문자 세트를 기반으로 백 슬래시 플러스 문자 형식으로 탈출하는 것입니다. 예를 들어:
<span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$escaped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">addcslashes</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'l'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped</span></span><span>; </span><span><span class="hljs-comment">// 산출: He\l\lo, Wor\l\d!</span></span><span>
</span></span>위의 예에서 addcslashes는 모든 문자 L 을 \ l 로 탈출합니다.
AddCSlashes는 문자열에서 특정 문자를 탈출하는 데 사용될 수 있지만 특히 보안 측면에서 HTML 양식 데이터를 처리하는 데 적합하지 않습니다. 이유는 다음과 같습니다.
HTML 주입을 방지 할 수 없습니다 : AddCslashes는 단순히 문자를 빠져 나가고 HTML 태그를 처리하지 않습니다. 양식 데이터에 악의적 인 <cript> 태그 또는 기타 HTML 요소가 포함 된 경우 AddCSlashes는 이러한 내용의 실행을 방해 할 수 없으며 XSS (크로스 사이트 스크립팅 공격) 취약성으로 이어질 수 있습니다.
캐릭터 탈출은 너무 간단합니다 . AddcSlashes 는 주로 인용문, 백 슬래시 등과 같은 제어 문자 나 특수 문자를 피하는 데 사용되지만 몇 가지 일반적인 보안 문제를 고려하지 않습니다. 예를 들어, AddcSlashes는 사용자 입력에 포함될 수있는 악의적 인 JavaScript 코드 또는 SQL 주입로부터 효과적으로 보호 할 수 없습니다.
데이터베이스 쿼리에는 적용 할 수 없습니다 : 양식 데이터를 데이터베이스에 저장하는 경우 AddCSlashes는 적절한 SQL 탈출 방법을 대체하지 않습니다. 예를 들어, MySQL 데이터베이스의 경우 입력을 수동으로 빠져 나가는 대신 매개 변수화 쿼리를 사용해야합니다.
HTML 양식 데이터를 처리하려면 다음은 몇 가지 더 적절한 방법입니다.
XSS 공격을 방지하기 위해 사용자가 웹 페이지에 직접 입력 한 데이터를 출력 해야하는 경우 HTMLSpecialchars 또는 Htmlentities 기능을 사용해야합니다. 악의적 인 HTML 또는 JavaScript가 실행되는 것을 방지하기 위해 특수 HTML 문자를 피할 수 있습니다.
<span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'user_input'</span></span><span>];
</span><span><span class="hljs-variable">$safe_input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$safe_input</span></span><span>; </span><span><span class="hljs-comment">// 산출安全的 HTML</span></span><span>
</span></span>Htmlspecialchars는 브라우저에 의해 HTML 요소로 구문 분석되지 않도록 < , > & " 및 ' html 엔티티로 변환합니다.
ENT_QUOTES 매개 변수는 이중 및 단일 따옴표가 모두 탈출되도록합니다.
SQL 쿼리의 경우 addcslashes를 사용하여 입력 데이터를 피하십시오. 데이터베이스 드라이버가 제공 한 매개 변수화 된 쿼리 방법을 사용하여 탈출 문제를 자동으로 처리하고 SQL 주입을 방지해야합니다.
예를 들어 MySQLI 또는 PDO를 사용하는 경우 다음 방법을 사용할 수 있습니다.
mysqli 사용 :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$user_input</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>PDO 사용 :
<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 * 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">$user_input</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</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><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">"/^[a-zA-Z0-9]+$/"</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Valid username!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid username!"</span></span><span>;
}
</span></span>이 접근법은 사용자 입력이 예상 형식을 충족시키지 않도록하지만 HTML 또는 SQL 보안 보호 기능을 완전히 대체하지는 않습니다.
AddCslashes는 Escape 메커니즘이 간단하고 충분한 보안이 없기 때문에 HTML 양식 데이터를 처리하는 데 적합하지 않습니다. 사용자가 입력 한 데이터의 경우 처리하는 올바른 방법은 다음을 사용해야합니다.
XSS 공격을 방지하기위한 htmlspecialchars 또는 htmlentities ;
SQL 주입을 방지하기 위해 매개 변수화 된 쿼리 ;
적절한 정규식을 사용하여 사용자 입력 형식을 확인하십시오.
이러한 방법은 응용 프로그램 보안을 효과적으로 개선하고 일반적인 취약점을 피할 것입니다. 따라서 개발자는 다양한 기능의 해당 시나리오를 이해하고 사용자 입력 데이터를 처리하는 가장 적절한 방법을 선택해야합니다.
관련 태그:
HTML addcslashes