过滤用户输入

时间:2011-05-11 15:41:35

标签: php mysql html forms input

我在这里阅读了很多关于过滤用户输入的问答,但大部分时间答案都取决于你在做什么。这就是我正在做的事情:

通过将在MySQL查询中使用的表单提交的数据:

function clean($field, $link)
{
    return mysql_real_escape_string($field, $link);
}

通过表格提交的数据将显示在HTML / PHP页面或电子邮件中:

function output_html($value)
{
    return stripslashes(htmlspecialchars($value));
}

从数据库显示的数据:

function output_db($value)
{
    return stripslashes($value);
}

这是否足以满足我的需求?有什么我不考虑的吗?

谢谢!

5 个答案:

答案 0 :(得分:6)

在将字符串插入SQL查询时使用mysql_real_escape_string(),无论输入来自何处。

在将字符串插入HTML代码时使用htmlspecialchars()htmlentities(),无论输入来自何处。

在将值插入URL的查询字符串时使用urlencode(),无论值来自何处。

如果这些数据来自用户,那么你肯定应该做这些事情,因为用户可能会尝试做坏事。但是除了安全性之外 - 如果你想将一个合法的字符串插入一个SQL查询并且该字符串碰巧有一个单引号字符,该怎么办?你仍然必须逃脱它。

答案 1 :(得分:2)

如果你刚开始的话,我真的会考虑使用像PDO这样的东西。您最终希望以这种方式迁移,所以为什么不立即开始。

PDO会自动清理您的输入,这很棒。它还将使用prepare()语句,因此您可以保证单个查询,从而防止某人使用“; DROP TABLE xxx;”进行攻击。或者这样的。

http://php.net/manual/en/book.pdo.php

答案 2 :(得分:2)

当您将数据插入SQL数据库时,您需要对其进行转义以防止SQL注入,并且mysql_real_escape_string()在mysql中使用stripslashes()是正确的。但是,您必须记住将其用于所有内容,因此容易出错。您应该使用类似PDO的东西,它会自动转义每个传入的值。

来自数据库的数据通常不需要任何特殊处理(即unescaping)。我不知道你在htmlspecialchars()尝试做什么。如果它是为了删除PHP插入的魔术引号,那么你应该这样做,从GET / POST / etc中提取用户提供的值。 (或完全禁用魔术引号,如果可以,并且没有任何其他依赖它的软件)

需要转发输出到html的数据以防止XSS。 stripslashes()是正确的功能。同样,我不知道您正在尝试使用{{1}}。而且,你需要记住要逃避每个值,这很容易出错。您至少应该考虑使用模板引擎或其他能够自动转义所有html值的内容的好处。

答案 3 :(得分:1)

如果你有能力,我建议使用mysqli而不是mysql,并使用预备语句:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();
?>

来源:http://php.net/manual/en/mysqli.prepare.php

这提供了基本类型检查,并为您进行了转义。我不建议输出db数据stripslashes,因为:

  1. 数据库数据可以包含斜杠
  2. 无论如何,数据库unescapes为你
  3. 关于显示HTML,还有htmlstriptags可以删除那些试图用标签等可爱的人。

答案 4 :(得分:0)

我建议你使用php 5.2中介绍的过滤器,它们很棒,为你节省了大量的数据验证和保护。点击这里

filter_input