• PHP Secure E-mails


    在上一节中的 PHP e-mail 脚本中,存在着一个漏洞。


    1. PHP E-mail 注入
    2. 首先,请看上一章中的 PHP 代码:
    3. <html>
    4. <head>
    5. <meta charset="utf-8">
    6. <title>教程(runoob.com)</title>
    7. </head>
    8. <body>
    9. <?php
    10. if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
    11.     // 发送邮件
    12.     $email = $_REQUEST['email'] ;
    13.     $subject = $_REQUEST['subject'] ;
    14.     $message = $_REQUEST['message'] ;
    15.     mail("someone@example.com", $subject,
    16.     $message, "From:" . $email);
    17.     echo "邮件发送成功";
    18. } else { // 如果没有邮箱参数则显示表单
    19.     echo "
    20.     Email:
    21.     Subject:
    22.     Message:
    23.     
    24.     
    25.     ";
    26. }
    27. ?>
    28. </body>
    29. </html>

    以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据。

    假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?

    1. someone@example.com%0ACc:person2@example.com
    2. %0ABcc:person3@example.com,person3@example.com,
    3. anotherperson4@example.com,person5@example.com
    4. %0ABTo:person6@example.com

    与往常一样,mail() 函数把上面的文本放入邮件头部,那么现在头部有了额外的 Cc:、Bcc: 和 To: 字段。当用户点击提交按钮时,这封 e-mail 会被发送到上面所有的地址!


    PHP 防止 E-mail 注入

    防止 e-mail 注入的最好方法是对输入进行验证。

    下面的代码与上一章中的类似,不过这里我们已经增加了检测表单中 email 字段的输入验证程序:

    1. <html>
    2. <head>
    3. <meta charset="utf-8">
    4. <title>教程(runoob.com)</title>
    5. </head>
    6. <body>
    7. <?php
    8. function spamcheck($field)
    9. {
    10.     // filter_var() 过滤 e-mail
    11.     // 使用 FILTER_SANITIZE_EMAIL
    12.     $field=filter_var($field, FILTER_SANITIZE_EMAIL);
    13.     //filter_var() 过滤 e-mail
    14.     // 使用 FILTER_VALIDATE_EMAIL
    15.     if(filter_var($field, FILTER_VALIDATE_EMAIL))
    16.     {
    17.         return TRUE;
    18.     }
    19.     else
    20.     {
    21.         return FALSE;
    22.     }
    23. }
    24. if (isset($_REQUEST['email']))
    25. {
    26.     // 如果接收到邮箱参数则发送邮件
    27.     // 判断邮箱是否合法
    28.     $mailcheck = spamcheck($_REQUEST['email']);
    29.     if ($mailcheck==FALSE)
    30.     {
    31.         echo "非法输入";
    32.     }
    33.     else
    34.     {    
    35.         // 发送邮件
    36.         $email = $_REQUEST['email'] ;
    37.         $subject = $_REQUEST['subject'] ;
    38.         $message = $_REQUEST['message'] ;
    39.         mail("someone@example.com", "Subject: $subject",
    40.         $message, "From: $email" );
    41.         echo "Thank you for using our mail form";
    42.     }
    43. }
    44. else
    45. {
    46.     // 如果没有邮箱参数则显示表单
    47.     echo "
    48.     Email:
    49.     Subject:
    50.     Message:
    51.     
    52.     
    53.     ";
    54. }
    55. ?>
    56. </body>
    57. </html>

    在上面的代码中,我们使用了 PHP 过滤器来对输入进行验证:

    • FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
    • FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值
  • 相关阅读:
    Educational Codeforces Round 155 (Rated for Div. 2)
    操作系统(linux0.11)的启动
    idna解码nginx重要文件的位置之[SUCTF 2019]Pythonginx
    多线程JUC 第2季 ReentranctLock实现加锁和解锁过程
    铝型材【欧标】
    css实现鼠标悬停时元素的显示与隐藏
    【每日训练】连续最大和
    基于QT实现的职工工资管理系统
    多商家AI智能名片商城系统(开源版)——构建高效数字化商业新生态
    torch.cuda.is_avaliable()在命令行里是true,pycharm是false【省流:换Pycharm】
  • 原文地址:https://blog.csdn.net/unbelievevc/article/details/126517248