我是新手,只是为了清楚。我听到很多关于逃避数据以防止XSS攻击的事情。我该怎么做呢?
这就是我目前正在做的事情 -
$s = mysqli_real_escape_string($connect,$_POST['name']));
这够了吗?感谢
答案 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命令,因此您将自动安全。