繁体   English   中英

过滤用户输入

[英]Filtering User 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);
}

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

谢谢!

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

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

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

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

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

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

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

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

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

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

如果你有能力,我建议使用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. DB数据可以包含斜杠
  2. 无论如何,数据库对你来说都是无法解决的

关于显示HTML,还有htmlstriptags可以剥离试图用标签等可爱的人。

我建议你使用php 5.2中介绍的过滤器它们很棒,并为你节省了大量的数据验证和保护。 检查一下

filter_input

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM