清理所有已发布字段的正确方法


Proper way to sanitize ALL posted fields?

我是清理输入数据的新手,但我们开始迅速增加客户端数量,因此我们需要清理所有用户输入,以防万一,因为这是最佳实践。

如果我有一个发布 12 个字段的表单,那么最好和最便宜的清理方法是什么?

为了简单起见,假设我有

$one = $_POST['one'];
$two = $_POST['two'];
$three = $_POST['three'];
$four = $_POST['four'];
$five = $_POST['five'];

编辑:就在这里 - 这入到元数据下的数据库中。然后我打电话给

那我只是打电话

printf('The input for One is ' .$theNewVarForOne. '!');

但是那里有恶意代码的可能性。剥离所有不稳定输入的最佳方法是什么?

编辑:

我应该更具体。我基本上是在创建一些存储在数据库中的"帖子"数据。标题、日期、正文等。

如果你打印到屏幕上,那么HTMLspecialchars应该没问题:

echo htmlspecialchars($_POST['one']);

它将任何潜在的恶意javascript和HTML转换为<等字符,以便它在源代码中显示为文本(意味着它无法执行),并且对用户来说,它看起来像屏幕上显示的原始输入:

<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

另一方面,如果您要插入数据库,则需要做一些额外的工作。

插入数据库时,您确实需要使用预准备语句(这将阻止任何人对您的数据库使用 SQL 执行任何时髦的操作)。我更喜欢使用 PDO 来建立连接。

代码将如下所示(从准备文档中截取

):
<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>

如果要将其插入数据库,我建议您使用 Fluffeh 的方法,但一个肮脏的快速解决方法是使用 mysql_real_escape_string。