PHP 보안 기능: Strip_tags, filter_var, Md5 및 sha1

⚡ 스마트 요약

PHP 보안은 데이터의 유효성 검사, 정제 및 안전한 저장을 통해 공격자와 부주의한 입력으로부터 웹 애플리케이션을 보호합니다. 이 가이드에서는 주요 위협 요소를 살펴본 후 strip_tags, filter_var, esca를 사용하는 방법을 보여줍니다.ping또한 XSS, SQL 인젝션 및 자격 증명 도용으로부터 보호하기 위해 password_hash를 사용한 최신 암호 해싱 기능을 제공합니다.

  • 🛡️ 위협 요소를 파악하세요: 주요 위험은 SQL 인젝션, 크로스 사이트 스크립팅, 코드 인젝션이며, 이는 주로 폼이나 URL 매개 변수를 설정합니다.
  • 🧹 스트립 태그: strip_tags는 HTML을 제거합니다. Java입력에서 스크립트 및 PHP 태그를 추출하여 저장된 크로스 사이트 스크립팅 공격의 위험을 줄입니다.
  • ✅ 입력 유효성 검사: `filter_var`는 데이터의 유효성을 검사하고 정제하여, 코드가 해당 값을 신뢰하기 전에 값이 예상되는 유형인지 확인합니다.
  • 🔒 탈출 또는 속박: mysqli_real_escape_string은 쿼리 입력을 이스케이프 처리하지만, 매개변수화된 준비된 문이 SQL 인젝션에 대한 더 강력한 방어 수단입니다.
  • 🔑 비밀번호를 올바르게 해시하세요: MD5 또는 SHA1을 사용하여 비밀번호를 저장하지 마십시오. 느리지만 솔트가 추가된 bcrypt 해싱을 적용하는 password_hash 및 password_verify 함수를 사용하십시오.
  • 💡 심층 방어: 결합 검증, 에스케이프ping단일 제어 방식에 의존하는 대신 HTTPS 및 최소 권한 데이터베이스 계정을 사용합니다.
  • 🤖 AI 지원: AI 도구는 PHP 코드의 보안 취약점을 검사하고 SQL 인젝션이나 XSS 취약점을 안전하게 수정하는 데 도움을 줄 수 있습니다.

PHP 보안

잠재적인 보안 위협

시스템을 공격할 수 있는 사람들은 크게 두 그룹으로 나뉩니다.

  • 해커 – 승인되지 않은 데이터에 접근하거나 애플리케이션을 방해하려는 의도를 가지고 있습니다.
  • 사용자들이 의도치 않게 양식에 잘못된 매개변수를 입력할 수 있으며, 이는 웹사이트나 웹 애플리케이션에 부정적인 영향을 미칠 수 있습니다.

우리가 조심해야 할 공격 유형은 다음과 같습니다.

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

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

PHP 스트립_태그

이제 strip_tags 함수를 사용하여 이러한 공격으로부터 애플리케이션을 보호해 보겠습니다.

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

찾아보기 URL http://localhost/phptuts/comments.php

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.

PHP Md5 및 PHP sha1

중요 사항: 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에서 비밀번호를 처리하는 올바르고 미래 지향적인 방법입니다.

자주 묻는 질문

mysqli 또는 PDO에서 바인딩된 매개변수를 사용하는 준비된 문(prepared statement)을 사용하십시오. 이렇게 하면 쿼리와 데이터가 별도로 전송되므로 사용자 입력으로 인해 쿼리 구조가 변경될 수 없습니다. 이는 수동으로 에스컬레이션하는 것보다 훨씬 강력한 보안 방식입니다.ping 입력.

`strip_tags`는 HTML 및 PHP 태그를 완전히 제거하고, `htmlspecialchars`는 해당 태그를 안전한 엔티티로 변환하여 텍스트로 표시합니다. 출력 예시는 다음과 같습니다.ping XSS 공격에 대비하려면 htmlspecialchars를 사용하는 것이 일반적으로 더 안전한 선택입니다.

세션별로 고유한 CSRF 토큰을 생성하고, 모든 양식에 숨겨진 필드로 포함시킨 후 제출 시 유효성을 검사합니다. 토큰이 없거나 저장된 값과 일치하지 않는 요청은 모두 거부합니다.

네. AI는 SQL 인젝션, XSS, 안전하지 않은 비밀번호 해싱, 안전하지 않은 파일 처리 등을 검사하고 각 위험 요소를 설명하며 해결책을 제시할 수 있습니다. 하지만 AI는 보안 검토를 대체하는 것이 아니라, 유용한 초기 점검 도구로 활용해야 합니다.

네. 취약한 코드를 붙여넣으면 AI가 준비된 문장을 사용하여 코드를 다시 작성하고 에스컬레이션을 출력할 수 있습니다.ping입력 유효성 검사를 수행합니다. 수정된 코드를 테스트하고 원래 공격 입력에 대해 수정 사항이 유효한지 확인합니다.

이 게시물을 요약하면 다음과 같습니다.