这够了吗?
$listing = mysql_real_escape_string(htmlspecialchars($_POST['listing']));
答案 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_tags
和html_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 );
答案 5 :(得分:0)
这取决于你想要达到的目标。您的版本阻止(可能)所有SQL注入并删除HTML(更准确地说:阻止在发送到浏览器时对其进行解释)。您可以(也可能应该)在输出上应用htmlspecialchars()
,而不是输入。也许将来某些时候你想要允许简单的事情,如<b>
。
但还有更多的消毒,例如如果你期望一个电子邮件地址,你可以验证它确实是一个电子邮件地址。
答案 6 :(得分:0)
如前所述,不要在仅输入输出上使用htmlspecialchars。另一件需要考虑的事情是确保输入符合预期。例如,如果你期望一个数字使用is_numeric(),或者如果你期望一个字符串只有一定的大小或至少一定的大小检查。这样,您就可以提醒用户他们在输入中所犯的任何错误。
答案 7 :(得分:0)
除了清理数据外,您还应该对其进行验证。就像你要求年龄一样检查数字。或确保电子邮件地址有效。除了安全性之外,您还可以通知用户他们输入的问题。
我认为如果输入绝对是一个数字或绝对是一个电子邮件地址,几乎不可能进行SQL注入,因此可以增加安全级别。