如何在PHP中转义输出

时间:2011-02-28 11:44:07

标签: php security escaping xss

我是新手,只是为了清楚。我听到很多关于逃避数据以防止XSS攻击的事情。我该怎么做呢?

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

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

这够了吗?感谢

3 个答案:

答案 0 :(得分:7)

如果您将数据输出到html,则应使用 htmlspecialchars() 否则,如果您将数据存储在数据库中,则应使用mysqli_real_escape_string()转换字符串并转换数字(或使用两者的预准备语句) 并通过基于白名单的过滤方式保护标识符/运营商。

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

答案 1 :(得分:4)

您应该使用 htmlspecialchars 作为输出,而不是 mysqli_real_escape_string

答案 2 :(得分:0)

如果您刚刚开始修复代码以抵御攻击(意味着 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命令,因此您将自动安全。