• php基础-9


    PHP 表单验证:在处理 PHP 表单时请关注安全!

    在处理PHP表单时我们需要考虑安全性。本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

    PHP 表单验证实例

    <!DOCTYPE HTML> 
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    <style>
    .error {color: #FF0000;}
    </style>
    </head>
    <body> 
        
    <?php
    // 定义变量并默认设置为空值
    $nameErr = $emailErr = $genderErr = $websiteErr = "";
    $name = $email = $gender = $comment = $website = "";
    // $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
    if ($_SERVER["REQUEST_METHOD"] == "POST")// $_SERVER["REQUEST_METHOD"]  请求提交数据的方式,具体参数对应什么请求,看百度
    {
        if (empty($_POST["name"])) // empty($var): 当var存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE。
        {
            $nameErr = "名字是必需的"; 
        }
        else
        {
            $name = test_input($_POST["name"]);     // 自定义函数test_input(),
            // 检测名字是否只包含字母跟空格
            if (!preg_match("/^[a-zA-Z ]*$/",$name)) // preg_match 函数用于执行一个正则表达式匹配。(正则表达式还没学过)
            {
                $nameErr = "只允许字母和空格"; 
            }
        }
        if (empty($_POST["email"]))
        {
          $emailErr = "邮箱是必需的";
        }
        else
        {
            $email = test_input($_POST["email"]);
            // 检测邮箱是否合法
            if (!preg_match("/([w-]+@[w-]+.[w-]+)/",$email))
            {
                $emailErr = "非法邮箱格式"; 
            }
        } 
        if (empty($_POST["website"]))
        {
            $website = "";
        }
        else
        {
            $website = test_input($_POST["website"]);
            // 检测 URL 地址是否合法
            if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website))
            {
                $websiteErr = "非法的 URL 的地址"; 
            }
        }
        if (empty($_POST["comment"]))
        {
            $comment = "";
        }
        else
        {
            $comment = test_input($_POST["comment"]);
        }
        
        if (empty($_POST["gender"]))
        {
            $genderErr = "性别是必需的";
        }
        else
        {
            $gender = test_input($_POST["gender"]);
        }
    }
    function test_input($data) // 下面有讲解
    {
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;
    }
    ?>
    <!--在以下的HTML实例表单中, $nameErr, $emailErr, $genderErr, 和 $websiteErr,这些错误变量赋值相应的错误信息(上面已进行赋值),
    当用户输入错误或未输入时,将显示出来。通过添加脚本的方式来打印错误信息, 各个脚本会在信息输入错误时显示错误信息。-->
    <h2>PHP 表单验证实例</h2>
    <p><span class="error">* 必需字段。</span></p><!--样式用css写在<style里,显示红色>-->
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
        <!--$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,
    与 document root相关。所以, action=$_SERVER["PHP_SELF"] 会发送表单数据到当前页面,而不是跳转到不同的页面。-->
        <!--下面记录了有关$_SERVER的安全性问题-->
       名字: <input type="text" name="name" value="<?php echo $name;?>">
       <span class="error">* <?php echo $nameErr;?></span>
       <br><br>
       E-mail: <input type="text" name="email" value="<?php echo $email;?>">
       <span class="error">* <?php echo $emailErr;?></span>
       <br><br>
       网址: <input type="text" name="website" value="<?php echo $website;?>">
       <span class="error"><?php echo $websiteErr;?></span>
       <br><br>
       备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
       <br><br>
       性别:
       <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?>  value="female">女 
    <!---checked属性表示默认选中状态,较常见于单选按钮和复选按钮-->
       <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?>  value="male">男
       <span class="error">* <?php echo $genderErr;?></span>
       <br><br>
       <input type="submit" name="submit" value="Submit"> 
    </form>
    
    <?php
    echo "<h2>您输入的内容是:</h2>";
    echo $name;
    echo "<br>";
    echo $email;
    echo "<br>";
    echo $website;
    echo "<br>";
    echo $comment;
    echo "<br>";
    echo $gender;
    ?>
    
    </body>
    </html>
    
    通过 PHP 验证表单数据
    我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量,htmlspecialchars() 函数把特殊字符转换为 HTML 实体。
    这意味着 < 和 > 之类的 HTML 字符会被替换为 &lt; 和 &gt; 这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
    在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:
    <script>location.href('http://www.hacked.com')</script>
    - 这行js代码不会被执行,因为会被保存为转义代码,就像下面这样,原封不动的显示出来还:
    <script>location.href('http://www.hacked.com')</script>
    现在这条代码显示在页面上或 e-mail 中是安全的。
    在用户提交该表单时,我们还要做两件事:
    (通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
    (通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠()
    接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。
    我们把函数命名为 test_input()。
    现在,我们能够通过 test_input() 函数检查每个 $_POST 变量,脚本是这样的:
    // 以下是一个实例:
    <?php
    // 定义变量并设置为空值
    $name = $email = $gender = $comment = $website = "";
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $name = test_input($_POST["name"]);
      $email = test_input($_POST["email"]);
      $website = test_input($_POST["website"]);
      $comment = test_input($_POST["comment"]);
      $gender = test_input($_POST["gender"]);
    }
    function test_input($data) {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
    }
    ?>
    // ————————————————
    版权声明:本文为CSDN博主「南宫瑾」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u011861781/java/article/details/84662053
    
    $_SERVER["PHP_SELF"] 变量有可能会被黑客使用!
    当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,
    因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。
    XSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,
    嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
    指定以下表单文件名为 "test_form.php":
    <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
    现在,我们使用URL来指定提交地址 "test_form.php",以上代码修改为如下所示:
    <form method="post" action="test_form.php">
    这样做就很好了。
    但是,考虑到用户会在浏览器地址栏中输入以下地址:
    http://www.runoob.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
    以上的 URL 中,将被解析为如下代码并执行:
    <form method="post" action="test_form.php/"><script>alert('hacked')</script>
    代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)。 
    这仅仅只是一个简单的实例来说明PHP_SELF变量会被黑客利用。
    请注意, 任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,
    代码可以修改全局变量或者获取用户的表单数据。
    如何避免 $_SERVER["PHP_SELF"] 被利用?
    $_SERVER["PHP_SELF"] 可以通过 htmlspecialchars() 函数来避免被利用。
    form 代码如下所示:
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用 PHP_SELF 变量, 结果将输出如下所示:
    <form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">
    尝试该漏洞失败!
    
    // 使用 PHP 验证表单数据:
    首先我们对用户所有提交的数据都通过 PHP 的 htmlspecialchars() 函数处理。
    当我们使用 htmlspecialchars() 函数时,在用户尝试提交以下文本域:
    <script>location.href('http://www.runoob.com')</script>
    该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:
    &lt;script&gt;location.href('http://www.runoob.com')&lt;/script&gt;
    以上代码是安全的,可以正常在页面显示或者插入邮件中。
    

    PHP 表单 - 验证邮件

    以下代码将通过简单的方式来检测 e-mail 地址是否合法。如果 e-mail 地址不合法,将输出错误信息:

    $email = test_input($_POST["email"]);
    if (!preg_match("/([w-]+@[w-]+.[w-]+)/",$email)) {
      $emailErr = "非法邮箱格式"; 
    }
    
    以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息:
    $name = test_input($_POST["name"]);
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
      $nameErr = "只允许字母和空格"; 
    }
    /*
    preg_match — 进行正则表达式匹配。
    语法:
    int preg_match(string $pattern , string $subject [, array $matches [, int $flags ]])
    在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。如果提供了 matches ,
    则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
    */ 
    

    PHP - 验证 URL

    以下代码将检测URL地址是否合法 (以下正则表达式运行URL中含有破折号:"-"), 如果 URL 地址不合法,将输出错误信息:

    $website = test_input($_POST["website"]);
    if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) {
      $websiteErr = "非法的 URL 的地址"; 
    }
    

    PHP - 在表单中确保输入值

    在用户点击提交按钮后,为确保字段值是否输入正确,我们在HTML的input元素中插添加PHP脚本, 各字段名为: name, email, 和 website。 
    在备注中的 textarea 字段中,我们将脚本放于 <textarea> 和 </textarea> 标签之间。
    PHP脚本输出值为: $name, $email, $website, 和 $comment 变量。 
    然后,我们同样需要检查被选中的单选按钮, 对于这一点,我们 必须设置好checked属性(不是radio按钮的 value 属性) :
    
  • 相关阅读:
    RabbitMqBase消息队列小结
    PtrSwap不仅仅是原地交换两个数
    InterfaceSummary接口小结
    InterfaceDesign接口设计原则
    InitOrder初始化执行顺序
    golang面向对象编程思想
    golang之工厂模式
    golang之方法
    golang之结构体使用注意事项和细节
    golang之匿名函数结合defer
  • 原文地址:https://www.cnblogs.com/IronMind/p/13277679.html
Copyright © 2020-2023  润新知