代码之家  ›  专栏  ›  技术社区  ›  Mikey

我应该使用htmlspecialchars吗?

  •  1
  • Mikey  · 技术社区  · 9 年前

    我似乎很难理解何时使用 htmlspecialchars() .

    假设我在插入数据时执行以下操作:

    $_POST = filter_input_array(INPUT_POST, [
        'name' => FILTER_SANITIZE_STRING,
        'homepage' => FILTER_DEFAULT // do nothing
    ]);
    
    $course = new Course();
    $course->name = trim($_POST['name']);
    $course->homepage = $_POST['homepage']; // may contain unsafe HTML
    
    $courseDAO = DAOFactory::getCourseDAO();
    $courseDAO->addCourse($course);  // simple insert statement
    

    输出时,我会执行以下操作:

    $courseDAO = DAOFactory::getCourseDAO();
    $course = $courseDAO->getCourseById($_GET['id']);
    ?>
    
    <?php ob_start() ?>
    
    <h1><?= $course->name ?></h1>
    <div class="homepage"><?= $course->homepage ?></div>
    
    <?php $content = ob_get_clean() ?>
    
    <?php include 'layout.php' ?>
    

    我希望如此 $course->homepage 被浏览器视为HTML并呈现为HTML。

    我一直在读书 answers 关于这个问题。我应该使用 htmlspecialchars() 这里有什么地方吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Quentin    9 年前

    有三种类型的数据(来自安全POV)可以输出到HTML中:

    • 文本
    • 受信任的HTML
    • 不受信任的HTML

    (请注意,HTML属性和某些元素是特殊情况,例如onclick属性需要HTML编码的JavaScript,因此您的数据需要是HTML安全的 JS安全)。

    如果是文本,则使用 htmlspecialchars 将其转换为HTML。

    如果它是可信的HTML,那么只输出它。

    如果它是不受信任的HTML,则需要对其进行清理以使其安全。这通常意味着使用DOM解析器对其进行解析,然后删除白名单上未显示为安全的所有元素和属性(某些属性可能会使用特殊大小写进行筛选,而不是剥离),然后将DOM转换回HTML。像HTML Purifier这样的工具可以做到这一点。

    $课程->homepage=$_POST['homepage'];//可能包含不安全的HTML

    我想要那$course->主页被浏览器视为HTML并呈现。

    然后是第三种情况,需要过滤HTML。

        2
  •  2
  •   andrew    9 年前

    看起来您在数据库中存储原始html,然后稍后将其呈现到页面。

    在将数据存储到数据库之前,我不会对其进行过滤,这样会有损坏用户输入的风险,如果从未存储,则无法检索原始数据。

    如果您希望浏览器将输出的数据视为html,则否, htmlspecialchars 不是解决方案。

    然而,值得考虑使用 striptags 删除脚本标记以对抗XSS。具有 striptags 您必须将允许的标记列入白名单,这显然很繁琐,但很安全。

    它可能也值得你看一看 tinyMCE 看看他们是如何处理这些事情的

        3
  •  1
  •   chorn    9 年前

    如果您确定内容,请输出纯HTML。在所有其他资源上使用htmlspecialchars,特别是对于用户输入,以防止安全问题。