>php教程 >PHP开发 >php xfocus 주입 방지 정보

php xfocus 주입 방지 정보

黄舟
黄舟원래의
2016-12-14 11:49:501109검색

여기에는 깊은 기술적인 내용은 없고, 그냥 간략하게 얘기해봤습니다. (구체적인 설명이 없으면 다음 작업은 모두 PHP+MySQL+Apache 기반입니다.) 다양한 해커가 판치는 지금, 자신의 PHP 코드의 보안을 어떻게 구현하고 프로그램과 서버의 보안을 확보할 수 있는지는 매우 중요합니다. 중요한 문제입니다. PHP 보안에 대한 정보를 살펴보니 ASP보다 많지는 않습니다. 적어도 훨씬 적습니다. ㅎㅎ 그래서 이러한 상황을 방지하기 위해 글을 쓰고 싶었습니다. 여기에는 깊은 기술적인 내용은 없고, 그냥 간략하게 이야기한 것뿐입니다. (구체적인 설명이 없으면 다음 작업은 모두 PHP+MySQL+Apache의 상황을 기준으로 합니다.)
먼저 보안 문제에 대해 이야기해 보겠습니다. 위 글은 기본적으로 보안에 초점을 맞춘 글입니다. 몇 가지 보안 문제를 포괄적인 방식으로 소개합니다.

PHP로 코딩할 때 기본적인 보안 문제를 고려한다면 우선
1. 변수를 초기화하세요

왜 그렇게 말씀하시나요? 다음 코드를 살펴보겠습니다.
if ($admin)
{
echo '로그인 성공! ';
include('admin.php');
}
else
{
echo '당신은 관리자가 아니어서 관리할 수 없습니다! ';
}

자, 위의 코드는 정상적으로 실행되고 문제가 없는 것으로 보입니다. 그러면 잘못된 매개변수를 제출하면 어떤 영향이 있을까요? 생각해 보세요. 우리가 직접 관리자이고 직접 관리하는 걸까요?
물론, 우리는 그렇게 단순한 실수를 저지르지 않을 것이며, 매우 비밀스러운 오류로 인해 이 문제가 발생할 수도 있습니다. 예를 들어, 최근에 노출된 phpwind 1.3.6 포럼에는 취약점이 있습니다. 관리자 권한을 직접 얻으려면 초기화되지 않은 $skin 변수가 있어서 나중에 일련의 문제가 발생하기 때문입니다.

그렇다면 위와 같은 문제를 어떻게 피할 수 있을까요? 먼저 php.ini로 시작하고 php.ini에서 Register_global = off를 설정하십시오. 이는 등록된 모든 변수가 전역 변수가 아니므로 이를 피할 수 있음을 의미합니다. 하지만 우리는 서버 관리자가 아니며 코드를 통해서만 개선할 수 있습니다. 그렇다면 위 코드를 어떻게 개선할 수 있을까요? 다음과 같이 다시 작성합니다:
$admin = 0; // 변수 초기화
if ($_POST['admin_user'] && $_POST['admin_pass'])
{
// 제출된 관리 해당 처리 코드는 사용자 이름과 비밀번호가 올바른지 여부입니다.
// ...
$admin = 1
}
else
{
$admin = 0;
}

if ($admin)
{
echo '로그인 성공! ';
include('admin.php');
}
else
{
echo '당신은 관리자가 아니어서 관리할 수 없습니다! ';
}

처음에는 변수를 $admin = 0으로 초기화했기 때문에 이 취약점을 통해 관리자 권한을 얻을 수 없습니다.


2. SQL 인젝션 방지(sql 인젝션)

SQL 인젝션은 기본적으로 지난 2년 동안 ASP에서 PHP까지 포함해 현재 가장 유해한 프로그램이어야 합니다. 중국 대중적인 기술의 기본 원리는 제출된 변수를 필터링하지 않고 주입 지점을 형성한 후 악의적인 사용자가 일부 SQL 쿼리 문을 제출하도록 허용하여 중요한 데이터가 도난당하거나 데이터가 손실 또는 손상되거나 백엔드 관리에 침입되는 것입니다.
이제 주사 침입의 기본 방법을 이해했으니 어떻게 예방할 수 있을까요? 코드부터 시작해야 합니다.

웹에 데이터를 제출하는 방법에는 두 가지가 있다는 것을 알고 있습니다. 하나는 get이고 다른 하나는 post입니다. 따라서 많은 일반적인 SQL 주입은 get 메서드에서 시작되며 주입 문에는 일부 SQL 문이 포함되어야 합니다. sql 문이 없는데 어떻게 진행해야 할까요? sql 문에는
선택, 업데이트, 삭제, 삽입이라는 네 가지 주요 문장이 있습니다. 그러면 제출한 데이터를 필터링하면 이러한 문제를 피할 수 있을까요?
그래서 정규식을 사용하여 다음 함수를 구성합니다.

/*
함수 이름: inject_check()
함수 함수: 제출된 값에 SQL 주입 문자가 포함되어 있는지 감지하여 주입을 방지합니다. 서버 보안 보호
매개변수: $sql_str: 제출된 변수
반환값: 탐지 결과 반환, true 또는 false
함수 작성자: heiyeluren
*/
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str) // 필터
}

우리 함수에서는 select, insert, update, delete, Union, into, load_file, outfile /*, ./, ../, ' 등과 같은 모든 위험한 매개변수 문자열을 필터링합니다. 그런 다음 제출된 매개변수를 제어할 수 있습니다. 프로그램은 다음과 같이 구성될 수 있습니다.

if (inject_check($_GET['id']))
{
exit('제출한 데이터가 불법입니다. 확인 후 다시 제출해 주세요!')
}
else
{
$id = $_GET['id'];
echo '제출된 데이터가 합법적입니다. 계속하세요! ';
}
?>
우리는 위의 규칙을 준수하지만 요구 사항을 충족하지 않으므로 다른 상황에서는 확인할 수 있는 기능을 구축합니다. :

/*
함수명 : verify_id()
함수 함수 : 제출한 ID 클래스 값이 유효한지 확인
매개변수 : $id : 제출한 ID 값
반환값 : 처리된 ID를 반환
함수 작성자: heiyeluren
*/
function verify_id($id=null)
{
if (!$id) {exit('매개변수가 제출되지 않았습니다! ') } // 여부 판단 비어있습니다
elseif (inject_check($id)) { exit('제출된 매개변수가 불법입니다!') } // 주입 판단
elseif (!is_numeric($id)) {exit('The 제출된 매개변수가 불법입니다!') } // 숫자 판단
$id = intval($id); // 정수화

return $id; 그러면 검증을 수행할 수 있으므로 위의 프로그램 코드는 다음과 같습니다.

if (inject_check($_GET['id']))

{

exit('제출한 데이터가 불법입니다. , 확인하고 다시 제출하세요!');

}
else
{
$id = verify_id($_GET['id']) ; // $id를 필터링하기 위해 여기에 필터 함수가 인용되었습니다.
echo '제출된 데이터는 합법적입니다. 계속해주세요! ';
}
?>

여기서는 문제가 해결된 것 같습니다만, 우편으로 제출된 데이터와 대량의 데이터를 고려해 보셨나요?
예를 들어 '_', '%' 등 일부 문자는 데이터베이스에 해를 끼칠 수 있는데, 이러한 문자는 특별한 의미를 갖고 있는데 이를 제어하면 어떻게 될까요? 또 다른 요점은 php.ini에서 Magic_quotes_gpc = off일 때 데이터베이스 규칙을 준수하지 않는 제출된 데이터 앞에 ''가 자동으로 표시되지 않는다는 것입니다. 그런 다음 이러한 문제를 제어해야 하므로 다음과 같이 빌드합니다.

/*
함수명 : str_check()

함수 함수 : 제출된 문자열을 필터링

매개변수 : $var : 처리할 문자열
반환값 : 필터링된 문자열을 반환
함수 작성자: heiyeluren
*/
function str_check( $str )
{
if (!get_magic_quotes_gpc()) // Magic_quotes_gpc가 켜져 있는지 확인
{
$str = addlashes($str); // 필터
}
$str = str_replace("_", "_", $str) // '_' 필터링
$str = str_replace ("%", "%", $str); // '%' 필터링

return $str; 서버가 손상되었습니다.

마지막으로 게시, 기사 작성, 뉴스 작성 등 대규모 데이터 일괄 제출을 고려해보세요. 위의 기능을 기반으로 다음 기능을 구축하는 데 도움이 됩니다. 🎜>

/*
함수명: post_check()

함수 함수: 제출된 편집 내용 처리

매개변수: $post: 제출할 내용

반환값: $post: Return 필터링된 콘텐츠

함수 작성자: heiyeluren

*/

function post_check($post)
{
if (!get_magic_quotes_gpc()) // Magic_quotes_gpc가 열려 있는지 확인
{
$post = addlashes($post); // Magic_quotes_gpc가 켜지지 않은 경우 제출된 데이터를 필터링합니다.
}
$post = str_replace("_", "_", $ post) // 필터링' _'
$post = str_replace("%", "%", $post); // '%' 필터링
$post = nl2br($post) ; // 변환 입력
$post = htmlspecialchars($post); // HTML 태그 변환

return $post;
}

하하, 기본적으로 여기까지가 몇 가지 상황에 대해 이야기한 것 같습니다. 나는 거의 말하지 않았습니다. 적어도 두 가지 측면에 대해서만 이야기했으며 전체 보안에 대한 내용은 거의 없습니다. 다음에는 PHP 보안 구성, 아파치 보안 등에 대해 더 이야기하겠습니다. 우리의 보안은 전체적으로 가장 안전합니다.

마지막으로 위에 표현된 내용을 말씀드리겠습니다. 1. 변수를 초기화합니다. 2. 변수를 반드시 필터링합니다.

더 많은 관련 내용을 확인하고 싶다면 읽어주셔서 감사합니다. PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.