如何在PHP中清理用户输入?

时间:2010-01-06 09:18:44

标签: php user-input

这够了吗?

$listing = mysql_real_escape_string(htmlspecialchars($_POST['listing']));

8 个答案:

答案 0 :(得分:3)

取决于 - 如果你期待文本,那就没关系了,尽管你不应该把htmlspecialchars放在输入中。在输出中做。

您可能需要阅读此内容:What's the best method for sanitizing user input with PHP?

答案 1 :(得分:3)

你可以使用php函数:filter_var()

链接中的一个很好的教程:

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html

清理整数的示例:

使用FILTER_SANITIZE_INT过滤器来简化Integer很简单。此过滤器会删除除数字和之外的所有字符。 + - 它使用起来很简单,我们不再需要用正则表达式来思考我们的思想。

<?php

/*** an integer ***/
$int = "abc40def+;2";

/*** sanitize the integer ***/
echo filter_var($int, FILTER_SANITIZE_NUMBER_INT);

?>

上面的代码产生40 + 2的输出,因为过滤器指定的非INT值已被删除

答案 2 :(得分:1)

请参阅:

在数据被用于需要安全的上下文之前立即清理数据。 (例如,在您要输出HTML之前不要运行htmlspecialchars,在此之前您可能需要未经编辑的数据(例如,如果您决定通过电子邮件从数据库发送内容)。)

答案 3 :(得分:0)

是。但是,您不应在输入中使用htmlspecialchars。仅在输出时,打印时。

这是因为,不确定输出是否总是通过html。它可能是通过一个终端,所以如果奇怪的代码突然出现,它可能会混淆用户。

答案 4 :(得分:0)

如果您的列表变量是数组怎么办?

你应该递归地清理这个变量。

编辑:

实际上,使用这种技术可以避免SQL注入,但是你无法避免使用XSS。

为了消毒“不可靠”的字符串,我通常会将strip_tagshtml_entity_decode结合起来。 这样,即使字符以&#321;方式编码,我也会避免所有代码注入。

$cleaned_string = strip_tags( html_entity_decode( $var, ENT_QUOTES, 'UTF-8' ) );

然后,你必须构建一个递归函数,它调用前面的函数并遍历多维数组。

最后,当您想将变量用于SQL语句时,可以使用DBMS特定的(或PDO)转义函数。

$var_used_with_mysql = mysql_real_escape_string( $cleaned_string );

答案 5 :(得分:0)

这取决于你想要达到的目标。您的版本阻止(可能)所有SQL注入并删除HTML(更准确地说:阻止在发送到浏览器时对其进行解释)。您可以(也可能应该)在输出上应用htmlspecialchars(),而不是输入。也许将来某些时候你想要允许简单的事情,如<b>

但还有更多的消毒,例如如果你期望一个电子邮件地址,你可以验证它确实是一个电子邮件地址。

答案 6 :(得分:0)

如前所述,不要在仅输入输出上使用htmlspecialchars。另一件需要考虑的事情是确保输入符合预期。例如,如果你期望一个数字使用is_numeric(),或者如果你期望一个字符串只有一定的大小或至少一定的大小检查。这样,您就可以提醒用户他们在输入中所犯的任何错误。

答案 7 :(得分:0)

除了清理数据外,您还应该对其进行验证。就像你要求年龄一样检查数字。或确保电子邮件地址有效。除了安全性之外,您还可以通知用户他们输入的问题。

我认为如果输入绝对是一个数字或绝对是一个电子邮件地址,几乎不可能进行SQL注入,因此可以增加安全级别。