【问题标题】:How to properly escape PHP $_POST variables from AJAX form?如何从 AJAX 表单中正确转义 PHP $_POST 变量?
【发布时间】:2013-02-26 23:10:56
【问题描述】:

我使用 jQuery 创建了一个 AJAX 提交表单并使用 PHP 处理表单邮件程序(如下所示。)根据下面的代码,从 AJAX 接收的内容中转义超全局 $_POST 变量的最佳方法是什么/jQuery 形式?可以将 trim() 函数包装在 htmlspecialchars() 函数中吗?在发送 php 邮件时,由于电子邮件的内容没有被插入到数据库中,我必须关注哪种类型的安全性。

<?php

    $content_link = trim($_POST['content_link']);
    $email = trim($_POST['email']);
    $viewport_size = trim($_POST['viewportsize']);
    $browser = trim($_POST['browser']);
    $os = trim($_POST['os']);
    $current_page = trim($_POST['current_page']);

    $to = '<example@example.com>';      
    $from = '<' . $email . '>';
    $subject = 'Form Submission';   
    $message = '
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
    <table>
        <tr><td>Content Link:</td><td>' . nl2br($content_link) . '</td></tr>
        <tr><td>Email:</td><td>' . $email . '</td></tr>
        <tr><td>Viewport Size:</td><td>' . $viewport_size . '</td></tr>
        <tr><td>Browser/OS:</td><td>' . $browser . '/' . $os . '</td></tr>
        <tr><td>Current Page:</td><td>' . $current_page . '</td></tr>
    </table>
    </body>
    </html>';

    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
    $headers .= 'From: ' . $from . "\r\n";

    mail($to,$subject,$message,$headers);

【问题讨论】:

  • htmlentites($value) 用于回显任何数据以防止人们提交 javascript 等。
  • 你需要做一些工作来防止email injection

标签: php jquery ajax


【解决方案1】:

您可以简单地将 htmlentities 函数包装在变量周围,因为您没有进行任何数据库调用。您还可以通过使用提取函数来简化为帖子分配变量的过程

<?php

    extract($_POST);

    $to = '<example@example.com>';      
    $from = '<' . $email . '>';
    $subject = 'Form Submission';   
    $message = '
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
    <table>
        <tr><td>Content Link:</td><td>' . nl2br(htmlentities(trim($content_link))) . '</td></tr>
        <tr><td>Email:</td><td>' . htmlentities(trim($email)) . '</td></tr>
        <tr><td>Viewport Size:</td><td>' . htmlentities(trim($viewportsize)) . '</td></tr>
        <tr><td>Browser/OS:</td><td>' . htmlentities(trim($browser)) . '/' . htmlentities(trim($os)) . '</td></tr>
        <tr><td>Current Page:</td><td>' . htmlentities(trim($current_page)) . '</td></tr>
    </table>
    </body>
    </html>';

    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
    $headers .= 'From: ' . $from . "\r\n";

    mail($to,$subject,$message,$headers);

【讨论】:

  • 我是否还需要转义 $email 在它说的行: $from = '';
【解决方案2】:

如果你想去除 HTML 实体的所有输入,你也可以使用 strip_tags() 函数。

strip_tags() Example

【讨论】:

    【解决方案3】:

    在字段上使用正则表达式这是一种方法,另一种方法是使用filter_var('bob@example.com', FILTER_VALIDATE_EMAIL) 你可以将很多标志传递给 filter_var($_POST['content'], FILTER_SANITIZE_STRING) 有很多过滤器所以采取查看文档,特别注意电子邮件,因为有人可以注入 CC BCC。 htmlentities, htmlcharacters,我的意思是有很多方法可以完成这项工作,我可能会使用 regex 或 filter_var。

    【讨论】:

    • htmlentities 或 htmlcharacters 会保护我免受电子邮件注入吗?
    猜你喜欢
    • 2017-03-18
    • 2017-10-25
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多