좋은 사례, 이번에는 PHP 레코드를 개발할 때 사용해야 할 몇 가지 좋은 사례를 주로 선택했습니다. 특히 모범 사례 섹션에서 비밀번호와 흐름의 두 가지 사항에 대해 코딩 스타일, (개인적으로) 일반적인 관행에 대해 간략하게 논의할 것입니다.
2. 표준 PHP-FIG와 PSR을 알고 있다면 이 부분은 건너뛰세요.
PHP 컴포넌트와 프레임워크가 많이 발생하는데, 별도로 개발된 프레임워크에서는 다른 프레임워크와의 통신을 고려하지 않는다는 문제가 있습니다. 이는 개발자와 프레임워크 자체에 해가 됩니다.
PHP-FIG
는 PHP 프레임워크 이 문제는 2009년 php|tek(인기 있는 PHP 컨퍼런스)에서 논의되었습니다. 토론 후 결론은 다음과 같습니다. 프레임워크의 상호 운용성을 향상하려면 따라서 PHP 프레임워크 개발자는 다음과 같습니다. php|tek에서 우연히 만난 사람은 PHP-FIG라고 불리는 PHP 프레임워크 Interop 그룹을 조직했습니다.
end
ation(PHP 권장 표준)의 약어입니다. 오늘부터 PHP-FIG는PSR-2: 엄격한 코딩 스타일 PSR-3: 로거 처음 권장 사양이 4개뿐이고 틀린 부분은 없습니다. PSR-0은 폐기되고 새로 출시된 PSR-4로 대체되었습니다 커뮤니티 표준에 맞춰 작성하려는 경우 PSR-2는 PSR-1을 기반으로 하는 PHP코드 사양을 추가로 정의합니다. 이 표준은 들여쓰기와 같은 세기의 많은 문제를 해결합니다. 표준 설정 4.PSR-3: 로거 인터페이스 각 메서드는 RFC 5424 프로토콜의 로그 수준에 해당합니다. 이 권장 사항은 표준 오토로더 전략을 설명합니다. 오토로더 전략은 런타임 시 요청에 따라 PHP 클래스, 인터페이스 또는 특성을 찾아 이를 PHP 인터프리터에 로드하는 것을 의미합니다.
는 먼저 PSR-1을 준수해야 합니다. 이 표준을 준수하는 것은 매우 간단합니다. 아마도 이미 해당 표준에 대한 자세한 내용을 작성하지는 않을 것입니다. >3.PSR-2: 엄격한 코딩 스타일
또한 많은 IDE(예: PHPStorm)에는 이제 코드 서식 표준을 설정하고 모든 내용의 서식을 지정하는 데 도움이 되는 코드 서식 기능이 있습니다. 권장 사양을 준수하고 줄 바꿈, 들여쓰기, 중괄호 등과 같은 일부 세부 사항을 수정합니다.
이 권장 사양은 이전 두 가지와 다릅니다. 이는 PHP 로거 구성 요소가 구현할 수 있는 메서드를 지정하는 인터페이스입니다. PSR-3 권장 사항을 준수하는 PHP 로거 구성 요소에는 PsrLogLoggerInterface 인터페이스를 구현하는 PHP 클래스가 포함되어야 합니다. PSR-3 인터페이스는 RFC 5424 시스템 로그 프로토콜을 재사용하고 구현할 9가지 메서드를 지정합니다. <?php namespace Psr\Log;
interface LoggerInterface
{
public function emergency($message, array $context = array());
public function alert($message, array $context = array());
public function critical($message, array $context = array());
public function error($message, array $context = array());
public function warning($message, array $context = array());
public function notice($message, array $context = array());
public function info($message, array $context = array());
public function debug($message, array $context = array());
public function log($level, $message, array $context = array());
}
<?php include 'path/to/file1.php';
include 'path/to/file2.php';
include 'path/to/file3.php';
함수(include(), include_once
(),
()를 사용하세요. ) , require_once()) 작업을 매우 잘 수행할 수 있습니다. 하지만 수천 개의 PHP 스크립트를 가져오고 싶다면 어떻게 해야 할까요? PSR-4 권장 사항 이전에 PHP 구성 요소 및 프레임워크 작성자는 autoload() 및 spl_autoload_register() 함수를 사용하여 사용자 정의 자동 로더 전략을 등록했습니다. 그러나 각 PHP 구성 요소와 프레임워크의 자동 로더는 고유한 자동 로더를 사용합니다. 따라서 많은 구성 요소를 사용할 때도 매우 번거롭습니다. 推荐使用PSR-4自动加载器规范,就是解决这个问题,促进组件实现互操作性。 PSR-4自动加载器策略 如何编写PSR-4自动加载器 使用htmlentities()函数过滤输入。
PSR-4推荐规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码。PSR-4的精髓是把命名空间的前缀和文件系统中的目录对应起来。比如,我可以告诉PHP,\Oreilly\ModernPHP命名空间中的类、接口和性状在物理文件系统的src/目录中,这样PHP就知道,前缀为\Oreilly\ModernPHP的命名空间中的类、接口和性状对应的src/目录里的目录和文件。
如果你在写自己的PSR-4自动加载器,请停下来。我们可以使用依赖管理器Composer自动生成的PSR-4自动加载器。三、良好实践
1.过滤、验证和转义
过滤HTML
<?php $input = '<p><script>alert("You won the Nigerian lottery!");</script>
需要注意的是:默认情况下,htmlentities()函数不会转义单引号,而且也检测不出输入字符串的字符集。正确的使用方式是:第一个参数输入字符串;第二个参数设为ENT_QUOTES常量,转移单引号;第三个参数设为输入字符串的字符集。
更多过滤HTML输入的方式,可以使用HTML Purifier库。这个库强健且安全,缺点:慢,且可能难以配置。
SQL查询
构建SQL查询不好的方式:
$sql = sprintf( 'UPDATE users SET password = "%s" WHERE id = %s', $_POST['password'], $_GET['id'] );
如果 psasword=abc";--
,则导致修改了整个users表的记录password都未abc。如果需要在SQL查询中使用输入数据,要使用PDO预处理语句。
用户资料信息
A.过滤用户资料中的电子邮件地址
这里会删除除字符、数字和!#$%&'*+-/=?^_{|}~@.[]`之外的所有其他符号。
<?php $email = 'beckjiang@meijiabang.cn'; $emailSafe = filter_var($email, FILTER_SANITIZE_EMAIL);
B.过滤用户资料中的外国字符
<?php $string = "外国字符"; $safeString = filter_var( $string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_ENCODE_HIGH );
验证数据
验证数据与过滤不同,验证不会从输入数据中删除信息,而是只确认输入数据是否符合预期。
验证电子邮件地址
我们可以把某个FILTER_VALIDATE_*标志传给filter_var()函数,除了电子邮件地址,还可以验证布尔值、浮点数、整数、IP地址、正则表达式和URL。
<?php $input = 'beckjiang@meijiabang.cn'; $isEmail = filter_var($input, FILTER_VALIDAE_EMAIL); if ($isEmail !== false) { echo "Success"; } else { echo "Fail"; }
2.密码
哈希算法有很多种,例如:MD5、SHA1、bcrypt和scrypt。有些算法的速度很快,用于验证数据完整性;有些算法速度则很慢,旨在提高安全性。生成密码和存储密码时需要使用速度慢、安全性高的算法。
目前,经同行审查,最安全的哈希算法是bcrypt。与MD5和SHA1不同,bcrypt是故意设计的很慢。bcrypt算法会自动加盐,防止潜在的彩虹表攻击。bcrypt算法永不过时,如果计算机的运算速度变快了,我们只需提高工作因子的值。
重新计算密码的哈希值
下面是登录用户的脚本:
<?php session_start(); try { // 从请求主体中获取电子邮件地址 $email = filter_input(INPUT_POST, 'email'); // 从请求主体中获取密码 $password = filter_input(INPUT_POST, 'password'); // 使用电子邮件地址获取用户(注意,这是虚构代码) $user = User::findByEmail($email); // 验证密码和账户的密码哈希值是否匹配 if (password_verify($password, $user->password_hash) === false) { throw new Exception('Invalid password'); } // 如果需要,重新计算密码的哈希值 $currentHashAlgorithm = PASSWORD_DEFAULT; $currentHashOptions = array('cost' => 15); $passwordNeedRehash = password_needs_rehash( $user->password_hash, $currentHashAlgorithm, $currentHashOptions ); if ($passwordNeedsRehash === true) { // 保存新计算得出的密码哈希值(注意,这是虚构代码) $user->password_hash = password_hash( $password, $currentHashAlgorithm, $currentHashOptions ); $user->save(); } // 把登录状态保存到回话中 ... // 重定向到个人资料页面 ... } catch (Exception $e) { //异常处理 ... }
值得注意的是:在登录前,一定要使用password_needs_rehash()函数检查用户记录中现有的密码哈希值是否过期。如果过期了,要重新计算密码哈希值。
PHP5.5.0之前的密码哈希API
如果无法使用PHP5.5.0或以上版本,可以使用安东尼·费拉拉开发的ircmaxell/password-compat组件。这个组件实现了PHP密码哈希API中的所有函数:
password_hash()
password_get_info()
password_needs_rehash()
password_verify()
3.日期、时间和时区
DateTime类
DateTime类提供一个面向对象接口,用于管理日期和时间。
没有参数,创建的是一个表示当前日期和时间的实例:
<?php $datetime = new DateTime();
传入参数创建实例:
<?php $datetime = new DateTime('2017-01-28 15:27');
指定格式,静态构造:
<?php $datetime = DateTime::createFromFormat('M j, Y H:i:s', 'Jan 2, 2017 15:27:30');
DateInterval类
DateInterval实例表示长度固定的时间段(比如,“两天”),或者相对而言的时间段(比如,“昨天”)。DateInterval实例用于修改DateTime实例。
使用DateInterval类:
<?php // 创建DateTime实例 $datetime = new DateTime(); // 创建长度为两周的间隔 $interval = new DateInterval('P2W'); // 修改DateTime实例 $datetime->add($interval); echo $datetime->format('Y-m-d H:i:s');
创建反向的DateInterval实例:
<?php // 过去一天 $interval = new DateInterval('-1 day');
DateTimeZone类
如果应用要迎合国际客户,可能要和时区斗争。
创建、使用时区:
<?php $timezone = new DateTimeZone('America/New_York'); $datetime = new DateTime('2017-01-28', $timezone);
实例化之后,也可以使用setTimeZone()
函数设置市区:
$datetime->setTimeZone(new DateTimeZone('Asia/Hong_Kong'));
DatePeriod类
有时我们需要迭代处理一段时间内反复出现的一系列日期和时间,DatePeriod类可以解决这种问题。DatePeriod类的构造方法接受三个参数,而且都必须提供:
一个Datetime实例,表示迭代开始时的日期和时间。
一个DateInterval实例,表示到下个日期和时间的间隔。
一个整数,表示迭代的总次数。
DatePeriod实例是迭代器,每次迭代时都会产出一个DateTime实例。
使用DatePeriod类:
<?php $start = new DateTime(); $interval = new DateInterval('P2W'); $period = new DatePeriod($start, $interval, 3); foreach ($period as $nextDateTime) { echo $nextDateTime->format('Y-m-d H:i:s'), PHP_EOL; }
4.数据库
PHP应用可以在很多种数据库中持久保存信息,比如:MySQL、SQLite、Oracle等。如果在项目中使用多种数据库,需要安装并学习多种PHP数据库扩展和接口,这增加了认知和技术负担。
正是基于这个原因,PHP原生提供了PDO扩展(PHP Data Objects,意思是PHP数据对象),PDO是一系列PHP类,抽象了不同数据库的具体实现。PDO的介绍和使用就不写了,比较常用。
5.流
在现代的PHP特性中,流或许是最出色但最少使用的。虽然PHP4.3.0就引入了流,但很多开发者不知道流的存在,因为很少人提及流,而且流的文档也匮乏。官方的解释比较难理解,一句话说就是:流的作用是在出发地和目的地之间传输数据。
我把流理解为管道,相当于把水从一个地方引到另一个地方。在水从出发地流到目的地的过程中,我们可以过滤水,可以改变水质,可以添加水,也可以排出水(提示:水是数据的隐喻)。
流封装协议
流式数据的种类各异,每种类型需要独特的协议,以便读写数据。我们称这些协议为流封装协议。比如,我们可以读写文件系统,可以通过HTTP、HTTPS或SSH与远程Web服务器通信,还可以打开并读写ZIP、RAR或PHAR压缩文件。这些通信方式都包含下述相同的过程:
开始通信。
读取数据。
写入数据。
结束通信。
虽然过程一样的,但是读写文件系统中文件的方式与手法HTTP消息的方式有所不同。流封装协议的作用是使用通用的几口封装这些差异。
每个流都有一个协议和一个目标。格式如下:
<scheme>://<target></target></scheme>
说这么多有点懵,先看例子,使用HTTP流封装协议与Flickr API通信:
<?php $json = file_get_contents( 'http://api.flickr.com/services/feeds/photos_public.gne?format=json' );
不要误以为这是普通的网页URL,file_get_contents()函数的字符串参数其实是一个流标识符。http协议会让PHP使用HTTP流封装协议。看起来像是普通的网页URL,是因为HTTP流封装协议就是这样规定的:)。其他流封装协议可能不是这样。
file://流封装协议
我们使用file_get_contents()
,<a href="http://www.php.cn/wiki/1325.html" target="_blank">fopen</a>()
,fwrite()
和<a href="http://www.php.cn/wiki/1303.html" target="_blank">fclose</a>()
函数读写文件系统。因为PHP默认使用的流封装协议是file://
,所以我们很少认为这些函数使用的是PHP流。
隐式使用file://
流封装协议:
<?php $handle = fopen('/etc/hosts', 'rb'); while (feof($handle) !== true) { echo fgets($handle); } fclose($handle);
显式使用file://
流封装协议:
<?php $handle = fopen('file:///etc/hosts', 'rb'); while (feof($handle) !== true) { echo fgets($handle); } fclose($handle);
流上下文
有些PHP流能接受一些列可选的参数,这些参数叫流上下文,用于定制流的行为。流上下文使用stream_context_create()
函数创建。
比如,你知道可以使用file_get_contents()
函数发送HTTP POST请求吗?如果想这么做,可以使用一个流上下文对象:
<?php $requestBody = '{"username": "beck"}'; $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => "Content-Type: application/json;charset=utf-8;\r\n" . "Content-Length: " . mb_strlen($requestBody), "content" => $requestBody ) )); $response = file_get_contents('https://my-api.com/users', false, $context);
流过滤器
关于PHP的流,其实真正强大的地方在于过滤、转换、添加或删除流中传输的数据。
注意:PHP内置了几个流过滤器:string.rot13、string.toupper、string.tolower和string.strp_tags。这些过滤器没什么用,我们要使用自定义的过滤器。
若想把过滤器附加到现有的流上,要使用stream_filter_append()
函数。比如,想要把文件中的内容转换成大写字母,可以使用string.toupper过滤器。书中不建议使用这个过滤器,这里只是演示如何把过滤器附加到流上:
<?php $handle = fopen('data.txt', 'rb'); stream_filter_append($handle, 'string.toupper'); while (feof($handle) !== true) { echo fgets($handle); // <-- 输出的全是大写字母 } fclose($handle);
使用<a href="http://www.php.cn/wiki/377.html" target="_blank">php://</a>filter
流封装协议把过滤器附加到流上:
<?php $handle = fopen('php://filter/read=string.toupper/resource=data.txt', 'rb'); while (feof($handle) !== true) { echo fgets($handle); // <-- 输出的全是大写字母 } fclose($handle);
来看个更实际的流过滤器示例,假如我们nginx访问日志保存在rsync.net,一天的访问情况保存在一个日志文件中,而且会使用bzip2压缩每个日志文件,名称格式为:YYYY-MM-DD.log.bz2。某天,领导让我提取过去30天某个域名的访问数据。使用DateTime类和流过滤器迭代bzip压缩的日志文件:
<?php $dateStart = new \DateTime(); $dateInterval = \DateInterval::createFromDateString('-1 day'); $datePeriod = new \DatePeriod($dateStart, $dateInterval, 30);//创建迭代器 foreach ($datePeriod as $date) { $file = 'sftp://USER:PASS@rsync.net/' . $date->format('Y-m-d') . 'log.bz2'; if (file_exists($file)) { $handle = fopen($file, 'rb'); stream_filter_append($handle, 'bzip2.decompress'); while (feof($handle) !== true) { $line = fgets($handle); if (strpos($line, 'www.example.com') !== false) { fwrite(STDOUT, $line); } } fclose($handle); } }
计算日期范围,确定日志文件的名称,通过FTP连接rsync.net,下载文件,解压缩文件,逐行迭代每个文件,把相应的行提取出来,然后把访问数据写入一个输出目标。使用PHP流,不到20行代码就能做完所有这些事情。
自定义流过滤器
其实大多数情况下都要使用自定义的流过滤器。自定义的流过滤器是个PHP类,继承内置的php_user_filter类。这个类必须实现filter()
、onCreate()
和onClose()
方法。而且,必须使用stream_filter_register()
函数注册自定义的流过滤器。
PHP流会把数据分成按次序排列的桶,一个桶中盛放的流数据量是固定的。一定时间内过滤器接收到的桶叫做桶队列。桶队列中的每个桶对象都有两个公开属性:data和datalen,分别是桶中的内容和内容的长度。
下面定义一个处理脏字的流过滤器:
<?php class DirtyWordsFilter extends php_user_filter { /** * @param resource $in 流来的桶队列 * @param resource $out 流走的桶队列 * @param resource $consumed 处理的字节数 * @param resource $closing 是流中最后一个桶队列吗? */ public function filter() { $words = array('grime', 'dirt', 'grease'); $wordData = array(); foreach ($words as $word) { $replacement = array_fill(0, mb_strlen($word), '*'); $wordData[$word] = implode(' ', $replacement); } $bad = array_keys($wordData); $goods = array_values($wordData); // 迭代流来的桶队列中的每个桶 while ($bucket = stream_bucket_make_writeable($in)) { // 审查桶数据中的脏字 $bucket->data = str_replace($bad, $goods, $bucket->data); // 增加已处理的数据量 $consumed += $bucket->datalen; // 把桶放入流向下游的队列中 stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } }
filter()
方法的作用是接受、处理再转运桶中的流数据。这个方法的返回值是PSFS_PASS_ON
常量,表示操作成功。
注册流过滤器
接着,我们必须使用stream_filter_register()
函数注册这个自定义的DirtWordsFilter流过滤器:
<?php stream_filter_register('dirty_words_filter', 'DirtWordsFilter');
第一个参数是用于识别这个自定义过滤器的过滤器名,第二个参数是自定义过滤器的类名。
使用DirtWordsFilter流过滤器
<?php $handle = fopen('data.txt', 'rb'); stream_filter_append($handle, 'dirty_words_filter'); while (feof($handle) !== true) { echo fgets($handle); // <-- 输出审查后的文本 } fclose($handle);
6.错误与异常
对错误和异常的处理,一定要遵守四个规则:
一定要让PHP报告错误。
在开发环境中要显示错误。
在生产环境中不能显示错误。
在开发环境和生产环境中都要记录错误。
错误与异常在日常使用的比较多,就不记录啦。
위 내용은 현재 PHP를 이해하고 있나요? (둘)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
