2011-04-30 59 views
3

可能重复:
PHP: the ultimate clean/secure function消毒用户提交内容的最佳方法?

我在PHP实验的社交网站合作。所以,会有很多用户提交的数据被发送到数据库。

我已经编写了一个自定义块脚本,而这只会阻止某些字符或关键字被提交。这工作,但它有问题的列表。

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

我尝试addslashes,它会添加斜线不能,不,等等,我不想这样。

我只想让我的数据库从xss,html,php和javascript攻击中安全。有什么建议?从PDO

  • filter_var()

  • 回答

    2
    • 预处理语句功能
    • 用htmlspecialchars()

    对于人谁不知道PHP或查找功能文档:

    • 准备好的陈述 - 将提供针对SQL注入的IDE保护(但不反对极端愚蠢)
    • filter_var() - 将让您确保真正的美国数据的URL或电子邮件地址等
    • 用htmlspecialchars() - 转换的字符,如<>&转换为html实体,从而防止XSS。

    我真的没有看到这里需要解释。

    +0

    如果没有解释什么时候需要什么,没有多大意义。 – 2011-04-30 22:31:59

    +0

    谢谢,对我有意义。感谢您的建议。 – Brad45 2011-04-30 23:07:23

    2

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

    +0

    谢谢,我会详细阅读。 – Brad45 2011-04-30 22:36:46

    +4

    -1表示在存储之前逃脱。这有一些缺点:良好的模板引擎会为你逃避。如果您的数据库包含已经转义的数据,这将会中断。此外,如果您想要在非HTML环境中显示数据,则会遇到问题,例如(明文)电子邮件。 – ThiefMaster 2011-04-30 22:38:28

    +0

    @ThiefMaster:好点,在去数据库之前删除了有关转义的一行。 – WhiteFang34 2011-04-30 22:41:29

    1
    1. 对于HTML类型输入,使用HTMLPurifier或类似过滤器来过滤不需要的标记。
    2. 在存储数据之前验证表单字段
    3. 在写入数据库时​​使用准备好的语句与PDO或MySQLi。如果您正确绑定参数,这将为您处理SQL转义。
    4. 在显示数据前,将数据库中的输出转义出来,除非它可以被认为是安全的。
    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数据并规范新行。所有控制字符(除标签(\t)和新行(\n))都是有条纹的,并且如果$control == true也被删除。


    PS:这不是从一个安全角度来看是非常有用的,但有助于避免GIGO