PHP源码中需要注意的几个问题

Yuan_Tuo

活捉一只小RBQ
2020-03-19
4
5
3
space.bilibili.com
当你决定使用PHP自己搭建一个网站,制作一个和用户交互的界面是必须的。
在这之中就存在着很多的安全隐患,如果你的代码并不规范,同时不幸遇到了技术特别厉害的大佬,可能整个服务器都会被入侵。


本人也是一个萌新,还请大佬在评论区补充指正!

一、服务器端
1.禁用函数
在服务器端的拦截就是禁用一些危险的函数。
详细的方法请自行百度,宝塔面板直接点击在首页『PHP』里的『禁用函数』就可以。

宝塔默认禁用以下函数
部分危险函数:passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
2.插件防止注入
宝塔用户可以直接在『软件商店』中下载安装『Nginx防火墙 』或『Apache防火墙 』。(两款插件售价19.8 免费版只有Nginx)


二、源码端
1.限制恶意JavaScript脚本
最简单的防止JavaScript脚本方法就是直接使用转义函数。

PHP:
<?php
    $str="<p>我是危险文本,直接输出运行会转跳B站空间</p> <script>window.location.href=\"https://space.bilibili.com/88197958\"</script>";
    echo addslashes($str);//在 单引号(')、双引号(")、反斜杠(\)、NULL 前面加上 反斜杠
    echo htmlspecialchars($str); //用这个函数可以把所有的html标签转换,如:<script>、<a>等
 
    /*
    输出结果:
    我是危险文本,直接输出运行会转跳B站空间
 
    <p>我是危险文本,直接输出运行会转跳B站空间</p> <script>window.location.href="https://space.bilibili.com/88197958"</script>
    */
可以看到,在这一番操作后,网页就不会转跳了。

2.限制MYSQL注入
同样,最简单的方法就是使用函数,请看下方的例程。

PHP:
<?php
    $item = "Zak's Laptop";
    $escaped_item = mysql_escape_string($item);
    printf ("Escaped string: %s\n", $escaped_item);
  
    //输出结果:Escaped string: Zak\'s Laptop
3.限制上传文件大小
如果你想要直接使用form表单直接上传文件,那么你就要注意限制文件大小。否则,可能程序上线第二天,服务器的几十个G就被填满了。

HTML:
<html>
<head>
<meta charset="utf-8">
<title>上传实例</title>
</head>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>

</body>
</html>
PHP:
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)    // 小于 200 kb 设置文件上传大小
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "非法的文件格式";
}
?>
4.验证码
验证码肯定是必不可少的一部分,传统的图片验证码会延长使用者的输入时间,让人感觉浏览不顺畅。这里我推荐使用腾讯防水墙,在微信和QQ中可以免去输入验证码,直接通过验证,后台文档有详细的接入文档。

5.CC攻击防御
最简单的方法就是套CDN,如:CloudFlare(萌新交流社就是套的这个CDN)。
有时候CDN不一定是加速,有时候一些免费的CDN反而会让你的页面变慢。(像催化剂一样 1585197676584.png
不要相信什么CC防御代码,只要攻击量大起来,该宕机的还是会宕的。根本原因就是,这个页面的返回还是由你的服务器来返回的。

一个无效的CDN防御页面

三、结语
总之,制作一个安全稳定运行的PHP网站并不简单,最理想的方法就是完整学习PHP以及HTML等语法。
如果时间不允许,在网上看看大神们的代码也可以增加自己的知识。

另外就是认识一些这方面“大佬”,帮助自己完善相关源码。


最后打个广告:
【小白教程】五分钟免费搭建网站
有兴趣可以看看哦,看完记得点个赞哦(* ̄︶ ̄)!!!