清理用户提交的内容的最佳方法是什么?

时间:2011-04-30 22:27:00

标签: php javascript mysql html xss

  

可能重复:
  PHP: the ultimate clean/secure function

我正在使用PHP进行实验性社交网站。因此,会有很多用户提交的数据发送到数据库。

我曾经编写过一个自定义块脚本,只会阻止某些字符或关键字被提交。这很有用,但它有问题清单。

我听说过addslashes和mysql_real_escape_string都会这样做,但在得到一些可靠的建议之前我不想做任何事情。

我尝试过addlashes,它会添加斜杠,不能,不要等等。我不想要。

我只是想让我的数据库免受xss,html,php和javascript攻击。有什么建议吗?

4 个答案:

答案 0 :(得分:3)

  • 来自PDO
  • 的预备陈述
  • filter_var()函数
  • 用htmlspecialchars()

对于不了解PHP或查找有关功能的文档的人:

  • 准备好的陈述 - 将提供针对SQL注入的保护(但不是针对极端愚蠢)
  • filter_var() - 会让您确保数据确实是我们的网址或电子邮件地址等。
  • htmlspecialchars() - 将<>&等字符转换为html实体,从而防范XSS。

我真的没有在这里看到解释的必要性。

答案 1 :(得分:3)

在将任何内容输出回用户之前,您应该HTML转义任何内容。然后,当它输出回来时,它将是安全的。使用htmlspecialchars用于PHP。有关详细信息,请参阅What are the best practices for avoiding xss attacks in a PHP site,并阅读OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet

答案 2 :(得分:2)

到目前为止所有的好答案,我只想补充一点,你应该确保输入数据采用所需的编码 - 你还应该规范化不同类型的新换行或完全控制字符,我最终使用以下功能:

function Filter($string, $control = true)
{
    $string = iconv('UTF-8', 'UTF-8//IGNORE', $string);

    if ($control === true)
    {
        return preg_replace('~\p{C}+~u', '', $string);
    }

    return preg_replace(array('~\r[\n]?~', '~[^\P{C}\t\n]+~u'), array("\n", ''), $string);
}

它将从字符串中删除所有无效的UTF-8数据并规范化新行。所有控件字符(tab(\t除外)和新行(\n)除外)都是条带化的,如果$control == true它们也被剥离了。


PS :从安全角度来看,这不是很有用,但有助于避免GIGO

答案 3 :(得分:1)

  1. 对于HTML类型输入,请使用HTMLPurifier或类似方法过滤掉不需要的标记。
  2. 在存储数据之前验证表单字段
  3. 在写入数据库时​​,将预准备语句与PDO或MySQLi一起使用。如果正确绑定参数,这将为您处理SQL转义。
  4. 除非可以认为是安全的,否则在显示之前退出数据库中输出的输出。