PHP 보안 기능: Strip_tags, filter_var, Md5 및 sha1
⚡ 스마트 요약
PHP 보안은 데이터의 유효성 검사, 정제 및 안전한 저장을 통해 공격자와 부주의한 입력으로부터 웹 애플리케이션을 보호합니다. 이 가이드에서는 주요 위협 요소를 살펴본 후 strip_tags, filter_var, esca를 사용하는 방법을 보여줍니다.ping또한 XSS, SQL 인젝션 및 자격 증명 도용으로부터 보호하기 위해 password_hash를 사용한 최신 암호 해싱 기능을 제공합니다.
잠재적인 보안 위협
시스템을 공격할 수 있는 사람들은 크게 두 그룹으로 나뉩니다.
- 해커 – 승인되지 않은 데이터에 접근하거나 애플리케이션을 방해하려는 의도를 가지고 있습니다.
- 사용자들이 의도치 않게 양식에 잘못된 매개변수를 입력할 수 있으며, 이는 웹사이트나 웹 애플리케이션에 부정적인 영향을 미칠 수 있습니다.
우리가 조심해야 할 공격 유형은 다음과 같습니다.
SQL 주입 이러한 유형의 공격은 악성 코드를 추가합니다. SQL 진술.
이는 사용자 입력 양식을 사용하거나 URL변수를 사용하는 것들.
첨부된 코드는 SQL 문의 WHERE 절에 있는 조건을 주석 처리합니다. 첨부된 코드는 또한 다음과 같은 기능을 수행할 수 있습니다.
- 항상 참인 조건을 삽입하세요.
- 테이블에서 데이터 삭제
- 테이블의 데이터 업데이트
이러한 유형의 공격은 일반적으로 애플리케이션에 대한 무단 액세스를 얻는 데 사용됩니다.
교차 사이트 스크립팅(XSS) 이러한 유형의 공격은 악성 코드를 삽입하는데, 일반적으로 Java스크립트. 이는 문의하기 양식이나 댓글 양식과 같은 사용자 입력 양식을 사용하여 수행됩니다. 이러한 작업은 다음과 같은 목적으로 수행됩니다.
- 다음과 같은 민감한 정보를 검색합니다. 쿠키 데이터
- 사용자를 다른 페이지로 리디렉션합니다. URL.
다른 위협으로는 PHP 코드 삽입, 셸 삽입, 이메일 삽입 및 스크립트 소스 코드 유출 등이 있습니다.
PHP 애플리케이션 보안 우수 사례
이제 PHP 개발 시 고려해야 할 몇 가지 PHP 보안 모범 사례를 살펴보겠습니다.ping 우리의 응용 프로그램.
PHP 스트립_태그
strip_tags 함수는 HTML을 제거합니다. JavaScript또는 문자열에서 PHP 태그를 추출합니다.
이 기능은 크로스 사이트 스크립팅과 같은 공격으로부터 애플리케이션을 보호해야 할 때 유용합니다.
사용자로부터 댓글을 받는 애플리케이션을 생각해 봅시다.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
comments.php 파일을 phptuts 폴더에 저장했다고 가정하고, 해당 파일로 이동하세요. URL http://localhost/phptuts/comments.php
사용자가 다음과 같은 내용을 입력했다고 가정해 보겠습니다. alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
찾아보기 URL http://localhost/phptuts/comments.php
이제 strip_tags 함수를 사용하여 이러한 공격으로부터 애플리케이션을 보호해 보겠습니다.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
찾아보기 URL http://localhost/phptuts/comments.php
PHP filter_var 함수
filter_var 함수는 데이터의 유효성을 검사하고 삭제하는 데 사용됩니다.
유효성 검사는 데이터가 올바른 유형인지 확인합니다. 문자열에 대한 숫자 유효성 검사는 잘못된 결과를 반환합니다.
삭제는 불법 문자를 제거하는 것입니다. 현.
자세한 내용은 다음 링크를 참조하세요. filter_var
아래 코드는 댓글 시스템을 위한 것입니다. 이 코드는 `filter_var` 함수와 `FILTER_SANITIZE_STRIPPED` 상수를 사용하여 태그를 제거합니다.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
출력:
alert('Your site sucks!');
참고 : FILTER_SANITIZE_STRIPPED(FILTER_SANITIZE_STRING의 별칭)는 PHP 8.1부터 더 이상 사용되지 않습니다. 새로운 코드에서는 strip_tags() 또는 안전한 표시를 위해 htmlspecialchars()를 사용하십시오.
PHP mysqli_real_escape_string
`mysqli_real_escape_string` 함수는 SQL 인젝션 공격으로부터 애플리케이션을 보호하는 데 사용됩니다.
사용자 ID와 비밀번호를 검증하는 다음과 같은 SQL 문이 있다고 가정해 보겠습니다.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
악의적인 사용자가 접근할 수 있습니다. ' 또는 1 = 1 — 사용자 ID 입력란에 1234를 입력하고 비밀번호 입력란에 1234를 입력합니다. 이제 인증 모듈을 코딩해 보겠습니다.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
최종 결과는 다음과 같습니다.
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
이리,
- “WHERE uid = ””는 사용자 ID가 비어 있는지 확인하는 조건입니다.
- "' 또는 1 = 1"은 항상 참인 조건입니다.
- "–"는 비밀번호를 확인하는 부분을 주석 처리합니다.
위 쿼리는 모든 사용자를 반환합니다. 이제 mysqli_real_escape_string 함수를 사용하여 로그인 모듈을 보호해 보겠습니다. 실제 코드에서 이 함수는 첫 번째 인수로 데이터베이스 연결을 받는다는 점에 유의하세요.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
참고: 두 번째 작은따옴표는 이스케이프 처리되었으므로 사용자 ID의 일부로 간주되어 비밀번호는 주석 처리되지 않습니다.
최고의 연습: Escaping 도움이 되긴 하지만, MySQLi나 PDO에서 매개변수화된 준비된 문을 사용하는 것이 SQL 인젝션 공격에 대한 권장 방어책입니다. 왜냐하면 데이터가 쿼리 텍스트에 섞이지 않기 때문입니다.
PHP Md5 및 PHP sha1
MD5는 Message Digest 5의 약자이고, SHA1은 Secure Hash Algorithm 1의 약자입니다. 둘 다 단방향 해싱 함수입니다.
아래 코드는 MD5와 SHA1의 구현을 보여줍니다.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
hashes.php 파일을 phptuts 폴더에 저장했다고 가정하고, 해당 파일로 이동하세요. URL.
중요 사항: MD5와 SHA1은 빠르고 솔트가 없는 해시 함수입니다. 더 이상 비밀번호를 저장하는 데 안전한 것으로 간주되지 않습니다.최신 하드웨어와 레인보우 테이블을 사용하면 빠르게 해독될 수 있기 때문입니다. 보안 체크섬이 아닌 경우에만 사용하고, 비밀번호에는 아래 방법을 사용하십시오.
PHP에서 비밀번호를 안전하게 해시하는 방법
PHP는 비밀번호 저장을 위해 `password_hash`와 `password_verify` 함수를 제공합니다. 이 함수들은 속도가 느리고 솔트가 포함된 알고리즘(기본값은 `bcrypt`)을 적용하므로, 각 해시 값은 고유하며 데이터베이스가 도난당하더라도 해독하기 어렵습니다.
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- 비밀번호_해시() 솔트가 추가된 해시값을 생성하여 데이터베이스에 저장합니다. PASSWORD_DEFAULT를 사용하면 현재 권장되는 알고리즘을 계속 사용할 수 있습니다.
- 비밀번호 확인() 저장된 해시값을 복호화하지 않고 로그인 시도를 검증합니다.
솔트와 알고리즘이 해시 내부에 저장되므로 사용자가 직접 관리할 필요가 없어 PHP에서 비밀번호를 처리하는 올바르고 미래 지향적인 방법입니다.





