【问题标题】:How to escape output in PHP如何在 PHP 中转义输出
【发布时间】:2011-02-28 19:56:20
【问题描述】:

我是新手,请注意。我听到很多关于转义数据以防止 XSS 攻击的信息。我该怎么做呢?

这就是我目前正在做的事情-

$s = mysqli_real_escape_string($connect,$_POST['name']));

这就够了吗?谢谢

【问题讨论】:

  • 您需要告诉我们您对数据做了什么。您是否将其插入数据库?还是在网站上输出?您对数据所做的每一件事都需要不同形式的卫生设施。
  • @pekoe both....在一个文件中我接受并插入...另一个...我输出。
  • 考虑一下,现在我要在数据库中插入 $s。是否足够安全?
  • 视情况而定。显示一些您用于将数据插入数据库的代码

标签: php security escaping xss


【解决方案1】:

如果你将数据输出到 html 你应该使用 htmlspecialchars() 否则,如果您将数据存储在数据库中,您应该使用 mysqli_real_escape_string() 和强制转换数字来转义 strings(或同时使用准备好的语句) 并通过基于白名单的过滤来保护标识符/运营商。

如果你以正确的方式使用它们,这两种方法都是你所需要的。

【讨论】:

  • 编辑您的答案以使其有用
【解决方案2】:

您应该使用 htmlspecialchars 而非 mysqli_real_escape_string 进行输出。

【讨论】:

  • @Chrism 通过输出,他的意思是 与您要求的输出相同。检查您的问题标题以获取提醒。
  • 在这种情况下,输出的意思是“作为 HTML 放入 HTML 文档的内容”(与 JavaScript 相对)。使用 echo、print、<?= 或其他什么都没关系。
  • 是的,当你将不可信的数据输出到数据库时,你使用mysqli_real_escape_string($something)$pdo->quote($something)或prepared statements。当您通过在他/她收到的 html 页面中回显某些内容向用户输出不受信任的数据时,您使用 htmlspecialchars($something, ENT_QUOTES);
  • @Carlos 这是每个人都期待的答案。
  • @Chrism 为避免大量安全漏洞(但并非所有漏洞都可以避免),您需要将输出到介质的数据转义。而且每种媒体都有不同的输出规则,因此对于数据库,您使用一组函数,对于 html/xml 另一组,使用不受信任的数据在服务器上执行另一个不同的进程......长话短说,每种媒体都是不同的,所以他们需要不同的功能
【解决方案3】:

如果您刚刚开始修复代码以抵御攻击(即 SQL 注入攻击),最好检查参数化查询。您基本上对这些内容所做的就是将您的内容(输入)与命令(sql)分开,因此您永远不会让它们被可能的恶意用户输入的信息(例如名称)混淆。

您可以尝试从使用 PDO 类开始: 你可以在这里开始阅读PDO 手册:http://php.net/manual/en/book.pdo.php 这个页面有一个很好的例子:http://php.net/manual/en/pdo.prepared-statements.php

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

但是,你不需要使用PDO,你也可以使用mysqli,见http://php.net/manual/en/mysqli.prepare.php

<?php
/* Script A -- We are already connected to the database */

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */
mysqli_stmt_bind_param($stmt, "si", $string, $integer);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt); // CLOSE $stmt
?>

因为名称是一个单独的值,所以它永远不能是 SQL 命令,所以你会自动安全。

【讨论】:

  • 为你添加了一个例子和一些链接:)
  • 这可以防止 SQL 注入攻击,而不是 XSS 攻击。
  • 是的。我认为最初的问题是关于这个的,@chrism 在两者之间感到困惑,让我也困惑了一会儿。
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多