>  기사  >  백엔드 개발  >  PHP의 보안 프로그래밍에 대한 몇 가지 조언

PHP의 보안 프로그래밍에 대한 몇 가지 조언

王林
王林앞으로
2019-08-20 10:27:221732검색

소개

인터넷 서비스를 제공하기 위해서는 코드 개발 시 항상 보안의식을 유지해야 합니다. 대부분의 PHP 스크립트는 보안 문제에 관심을 두지 않을 수도 있습니다. 그 이유는 해당 언어를 사용하는 경험이 없는 프로그래머가 너무 많기 때문입니다. 그러나 코드에 대한 불확실성 때문에 일관되지 않은 보안 정책을 가져야 할 이유는 없습니다. 돈과 관련된 모든 것을 서버에 올려놓으면 누군가가 그것을 해킹하려고 시도할 가능성이 있습니다. 포럼 프로그램이나 어떤 형태의 장바구니를 만들면 공격받을 가능성이 무한대로 늘어납니다.

추천 PHP 비디오 튜토리얼: https://www.php.cn/course/list/29/type/2.html

Background

웹 콘텐츠의 보안을 보장하기 위한 몇 가지 일반적인 사항은 다음과 같습니다. 보안 지침:

1. 양식을 신뢰하지 마세요

양식을 공격하기 쉽습니다. 간단한 JavaScript 트릭을 사용하면 평가 필드에 1부터 5까지의 숫자만 허용하도록 양식을 제한할 수 있습니다. 누군가 브라우저에서 JavaScript를 끄거나 사용자 정의 양식 데이터를 제출하면 클라이언트측 유효성 검사가 실패합니다.

사용자는 주로 양식 매개변수를 통해 스크립트와 상호 작용하므로 가장 큰 보안 위험이 있습니다. 무엇을 배워야 할까요? PHP 스크립트에서는 항상 PHP 스크립트에 전달된 데이터의 유효성을 검사하십시오. 이 기사에서는 사용자 자격 증명을 도용할 수 있는(또는 그보다 더 심각한 수준의) 크로스 사이트 스크립팅(XSS) 공격을 분석하고 방어하는 방법을 보여줍니다. 또한 데이터를 오염시키거나 파괴할 수 있는 MySQL 주입 공격을 방지하는 방법도 알아봅니다.

2. 사용자를 믿지 마세요

웹사이트에서 얻은 모든 데이터가 유해한 코드로 가득 차 있다고 가정하세요. 아무도 귀하의 사이트를 해킹하려고 시도하지 않을 것이라고 생각하더라도 모든 부분을 정리하십시오.

3. 전역 변수 끄기

가장 큰 보안 취약점은 register_globals 구성 매개변수를 활성화하는 것입니다. 다행히 PHP 4.2 이상에서는 이 구성을 기본적으로 비활성화합니다. register_globals가 켜져 있으면 php.ini 파일에서 register_globals 변수를 Off로 변경하여 이 기능을 끌 수 있습니다. register_globals 配置参数。幸运的是,PHP 4.2 及以后版本默认关闭了这个配置。如果打开了 register_globals,你可以在你的 php.ini 文件中通过改变 register_globals 变量为 Off 关闭该功能:

register_globals = Off

新手程序员觉得注册全局变量很方便,但他们不会意识到这个设置有多么危险。一个启用了全局变量的服务器会自动为全局变量赋任何形式的参数。为了了解它如何工作以及为什么有危险,让我们来看一个例子。

假设你有一个称为 process.php 的脚本,它会向你的数据库插入表单数据。初始的表单像下面这样:

<input name="username" type="text" size="15" maxlength="64">

运行 process.php 的时候,启用了注册全局变量的 PHP 会将该参数赋值到 $username 变量。这会比通过$_POST['username'] 或 $_GET['username'] 访问它节省击键次数。不幸的是,这也会给你留下安全问题,因为 PHP 会设置该变量的值为通过 GET 或 POST 的参数发送到脚本的任何值,如果你没有显示地初始化该变量并且你不希望任何人去操作它,这就会有一个大问题。

看下面的脚本,假如 $authorized 变量的值为 true,它会给用户显示通过验证的数据。正常情况下,只有当用户正确通过了这个假想的 authenticated_user() 函数验证,$authorized 变量的值才会被设置为真。但是如果你启用了 register_globals,任何人都可以发送一个 GET 参数,例如 authorized=1

<?php
// Define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}
?>

초보자 프로그래머는 매우 어렵다고 생각합니다. 전역 변수 등록 편리하지만 이 설정이 얼마나 위험한지 깨닫지 못할 것입니다. 전역 변수가 활성화된 서버는 모든 형태의 매개변수를 전역 변수에 자동으로 할당합니다. 작동 방식과 위험한 이유를 이해하기 위해 예를 살펴보겠습니다. 🎜🎜양식 데이터를 데이터베이스에 삽입하는 process.php라는 스크립트가 있다고 가정해 보세요. 초기 형식은 다음과 같습니다. 🎜
<?php
$post_value = $_POST[&#39;post_value&#39;];
$get_value = $_GET[&#39;get_value&#39;];
$some_variable = $_REQUEST[&#39;some_value&#39;]; 
?>
🎜 process.php 를 실행할 때 전역 변수 등록이 활성화된 PHP는 매개변수를 $username 변수에 할당합니다. 이렇게 하면 $_POST['username'] 또는 $_GET['username']을 통해 액세스하는 것에 비해 키 입력이 절약됩니다. 안타깝게도 이로 인해 보안 문제도 발생합니다. 왜냐하면 사용자가 명시적으로 변수를 초기화하지 않고 다른 사람도 초기화하지 않기를 원하는 경우 PHP는 GET 또는 POST 매개변수를 통해 스크립트에 전송되는 값으로 변수 값을 설정하기 때문입니다. 그것을 운영하려면 큰 문제가 발생할 것입니다. 🎜🎜아래 스크립트를 보면 $authorized 변수의 값이 true이면 검증된 데이터가 사용자에게 표시됩니다. 일반적으로 $authorized 변수의 값은 사용자가 가상의 authenticated_user() 함수 확인을 올바르게 통과한 경우에만 true로 설정됩니다. 하지만 register_globals를 활성화하면 누구나 authorized=1와 같은 GET 매개변수를 보내 이를 재정의할 수 있습니다. 🎜
<?php
// Define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}
?>

这个故事的寓意是,你应该从预定义的服务器变量中获取表单数据。所有通过 post 表单传递到你 web 页面的数据都会自动保存到一个称为 $_POST 的大数组中,所有的 GET 数据都保存在 $_GET 大数组中。文件上传信息保存在一个称为 $_FILES 的特殊数据中。另外,还有一个称为 $_REQUEST 的复合变量。

要从一个 POST 方法表单中访问username字段,可以使用 $_POST['username']。如果 username 在 URL 中就使用$_GET['username']。如果你不确定值来自哪里,用 $_REQUEST['username']

<?php
$post_value = $_POST[&#39;post_value&#39;];
$get_value = $_GET[&#39;get_value&#39;];
$some_variable = $_REQUEST[&#39;some_value&#39;]; 
?>

$_REQUEST $_GET$_POST、和 $_COOKIE 数组的结合。如果你有两个或多个值有相同的参数名称,注意 PHP 会使用哪个。默认的顺序是 cookiePOST、然后是 GET

以上就是为大家整理的一些编程安全建议。更过相关问题请访问PHP中文网:https://www.php.cn/

위 내용은 PHP의 보안 프로그래밍에 대한 몇 가지 조언의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 开发者头条에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제