PHP学习笔记(四)

2023-08-16 362 0

一. PHP超全局变量

PHP超全局变量,是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。

PHP 超级全局变量列表:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

1. $_GET

用于收集来自 method="get" 的表单中的值。

从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。

2. $_POST

用于收集来自 method="post" 的表单中的值。

从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。

二. PHP表单

1.表单和用户输入

<!DOCTYPE html>
<html lang="en">
    <?php include('templates/header.php'); ?>

    <section class="container grey-text">
        <h4 class="center">添加课程</h4>
        <form action="add.php" class="white" method="POST">
            <label for="email">邮箱</label>
            <input type="text" name="email">
            <label for="title">课程名称</label>
            <input type="text" name="title">
            <label for="points">知识要点(逗号隔开)</label>
            <input type="text" name="points">
            <div class="center">
                <input type="submit" name="submit" value="立即提交" class="btn brand z-depth-0">
            </div>
        </form>
    </section>

    <?php include('templates/footer.php'); ?>
</html>

php函数: isset() 检测变量是否已设置并且非 NULL

<?php 
    //$_GET $_POST 超全局变量
    if(isset($_POST['submit'])) {
        echo $_POST['email'] . '<br>';
        echo $_POST['title'] . '<br>';
        echo $_POST['points'] . '<br>';
    }
?>

2. XSS(跨站脚本攻击)

恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

例:在上方表单中输入:

<script>window.location="https://www.baidu.com/"</script>

点击立即提交,就会直接打开百度官网。

 任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。

可以通过 htmlspecialchars() 函数来避免被利用。

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;
  • " (双引号) 成为 &quot;
  • ' (单引号) 成为 &#039;
  • < (小于) 成为 &lt;
  • > (大于) 成为 &gt;

例:在上方示例中加入htmlspecialchats()函数

<?php 
    //$_GET $_POST 超全局变量
    if(isset($_POST['submit'])) {

        // xss(跨站脚本攻击)
        echo htmlspecialchars($_POST['email']) . '<br>';
        echo htmlspecialchars($_POST['title']) . '<br>';
        echo htmlspecialchars($_POST['points']) . '<br>';
    }
?>

再次往表单中输入:

<script>window.location="https://www.baidu.com/"</script>

点击提交,该代码将不会被执行。

3. 表单基础验证

必须字段:php函数- empty() 检查一个变量是否为空。

<?php 
    //$_GET $_POST 超全局变量
    if(isset($_POST['submit'])) {
        //验证邮箱
        //是否为空
        if(empty($_POST['email'])) {
            echo '邮箱不能为空 <br>';
        }else {
            echo htmlspecialchars($_POST['email']) . '<br>';
        }

        //验证课程名称
        //是否为空
        if(empty($_POST['title'])) {
            echo '课程名称不能为空 <br>';
        }else {
            echo htmlspecialchars($_POST['title']) . '<br>';
        }

        //验证知识要点
        //是否为空
        if(empty($_POST['points'])) {
            echo '至少提交一个知识要点 <br>';
        }else {
            echo htmlspecialchars($_POST['points']) . '<br>';
        }
    }
?>

4. 表单过滤

1)php过滤器:用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。

Filter函数

函数描述
filter_has_var()检查是否存在指定输入类型的变量。
filter_id()返回指定过滤器的 ID 号。
filter_input()从脚本外部获取输入,并进行过滤。
filter_input_array()从脚本外部获取多项输入,并进行过滤。
filter_list()返回包含所有得到支持的过滤器的一个数组。
filter_var_array()获取多个变量,并进行过滤。
filter_var()获取一个变量,并进行过滤。

PHP 过滤器

ID名称描述
FILTER_VALIDATE_EMAIL把值作为 e-mail 地址来验证。

2)正则表达式

php函数:preg_match() — 进行正则表达式匹配

<?php 
    //$_GET $_POST 超全局变量
    if(isset($_POST['submit'])) {
        // xss(跨站脚本攻击)

        //验证邮箱
        //是否为空
        if(empty($_POST['email'])) {
            echo '邮箱不能为空 <br>';
        }else {
            $email = $_POST['email'];
            if(!filter_var($email,FILTER_VALIDATE_EMAIL)) {
                echo '邮箱格式不正确 <br>';
            }
        }

        //验证课程名称
        //是否为空
        if(empty($_POST['title'])) {
            echo '课程名称不能为空 <br>';
        }else {
            $title = $_POST['title'];
            if(!preg_match('/^[\w\x{4e00}-\x{9fa5}]+$/u',$title)) {
                echo '课程名称不能包含特殊字符 <br>';
            }
        }

        //验证知识要点
        //是否为空
        if(empty($_POST['points'])) {
            echo '至少提交一个知识要点 <br>';
        }else {
            $points = $_POST['points'];
            if(!preg_match('/^([\w\x{4e00}-\x{9fa5}]+)(,\s*[\w\x{4e00}-\x{9fa5}\s]*)*$/u',$points)) {
                echo '知识要点必须以英文逗号隔开 <br>';
            }
        }
    }
?>

5.错误提示与页面重定向

1)PHP Array函数

PHP Array 函数允许您访问并操作数组。支持简单的数组和多维数组。

函数描述
array()创建数组。
array_filter()用回调函数过滤数组中的元素。

2)PHP HTTP 函数

HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作。

可用于重定向页面。

函数描述
header()向客户端发送原始的 HTTP 报头。
<?php 
    //初始化变量
    $email = $title = $points = "";
    //初始化报错数组
    $errors = array('email' => '', 'title' => '', 'points' => '');
    //$_GET 超全局变量
    if(isset($_POST['submit'])) {
        // xss(跨站脚本攻击)

        //验证邮箱
        //是否为空
        if(empty($_POST['email'])) {
            $errors['email'] = '邮箱不能为空';
        }else {
            $email = $_POST['email'];
            if(!filter_var($email,FILTER_VALIDATE_EMAIL)) {
                $errors['email'] = '邮箱格式不正确';
            }
        }

        //验证课程名称
        //是否为空
        if(empty($_POST['title'])) {
            $errors['title'] = '课程名称不能为空';
        }else {
            $title = $_POST['title'];
            if(!preg_match('/^[\w\x{4e00}-\x{9fa5}]+$/u',$title)) {
                $errors['title'] = '课程名称不能包含特殊字符';
            }
        }

        //验证知识要点
        //是否为空
        if(empty($_POST['points'])) {
            $errors['points'] = '至少提交一个知识要点';
        }else {
            $points = $_POST['points'];
            if(!preg_match('/^([\w\x{4e00}-\x{9fa5}]+)(,\s*[\w\x{4e00}-\x{9fa5}\s]*)*$/u',$points)) {
                $errors['points'] = '知识要点必须以英文逗号隔开';
            }
        }

        //所有验证通过
        if(array_filter($errors)) {
            echo '表单中存在错误信息';
        }else {
            header('Location:index.php');
            exit;
        }
    }
?>
<!DOCTYPE html>
<html lang="en">
    <?php include('templates/header.php'); ?>

    <section class="container grey-text">
        <h4 class="center">添加课程</h4>
        <form action="add.php" class="white" method="POST">
            <label for="email">邮箱</label>
            <input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>">
            <div class="red-text"><?php echo $errors['email']?></div>
            <label for="title">课程名称</label>
            <input type="text" name="title" value="<?php echo htmlspecialchars($title); ?>">
            <div class="red-text"><?php echo $errors['title']?></div>
            <label for="points">知识要点(逗号隔开)</label>
            <input type="text" name="points" value="<?php echo htmlspecialchars($points); ?>">
            <div class="red-text"><?php echo $errors['points']?></div>
            <div class="center">
                <input type="submit" name="submit" value="立即提交" class="btn brand z-depth-0">
            </div>
        </form>
    </section>

    <?php include('templates/footer.php'); ?>
</html>
<!-- <script>window.location="https://www.baidu.com/"</script> -->

6.PHP EOF(heredoc)定界符

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。

使用说明:

  • <<<EOF 开始标记开始,以EOF结束标记结束
  • 结束标记必须顶头写,独占一行,不能有缩进和空格
  • 在结束标记末尾要加分号
  • EOF可以用任意其他字符代替,开始标记和结束标记相同即可。比如:常用大写的 EOF, EOD, EOT 来表示,但是不只限于那几个(也可用:JSON,HTML等),只要保证开始标记和结束标记不在正文中出现即可。
  • 位于开始标记和结束标记之间的变量可以被正常解析,但是函数不可以。在heredoc中,变量不需要使用连接符 . 或 , 来拼接
  • 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义
<?php
$name = 'Summer';
$age = 25;
//EOF定界符
echo <<<EOF
    <h2>$name</h2> is $age years old
EOF;

echo <<<JSON
    <h2>$name</h2> is $age years old
JSON;

?>

相关文章

Laravel框架-环境配置
PHP面向对象
PHP学习笔记(六)
PHP学习笔记(五)
PHP学习笔记(三)
php学习笔记(二)

发布评论