2010-01-06 44 views
1

这够了吗?如何在PHP中对用户输入进行santize操作?

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

对用户输入进行什么操作?你想怎么做用户输入? – Gumbo 2010-01-06 09:22:04

+0

可能的重复:http://stackoverflow.com/questions/129677 – Gumbo 2010-01-06 09:22:59

+0

在提问前请使用搜索功能:http://stackoverflow.com/search?q=php+sanitize+user+input – soulmerge 2010-01-06 09:32:40

回答

0

是的。但是,您不应该在输入时使用htmlspecialchars。只在输出时打印它。

这是因为,不能确定输出将始终通过html。它可能通过终端,所以如果怪异的代码突然出现,它可能会让用户感到困惑。

0

如果你的列表变量是一个数组呢?

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

编辑:

其实,这种技术可以防止SQL注入,但你不能避免XSS。

为了消毒“不可靠”的字符串,我通常会合并strip_tagshtml_entity_decode。 这样,即使字符编码方式为Ł,我也避免了所有代码注入。

$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); 
0

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

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

0

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

3

您可以使用PHP函数:filter_var()

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

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

例如消毒整数:

消毒的整数与FILTER_SANITIZE_INT过滤器简单。此过滤器会去除除数字和字母以外的所有字符。 + - 使用起来很简单,我们不再需要用正则表达式来让我们的头脑发呆。

<?php 

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

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

?> 

以上代码生成的40 + 2作为无INT值的输出,作为由过滤器指定的,已被去除

0

除了消毒还应该验证它的数据。就像在询问年龄后检查数字一样。或者确保电子邮件地址有效。除了安全方面的益处外,您还可以通知用户输入问题。

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

相关问题