保护用户数据 - 用于方法调用,SQL和文件调用

时间:2009-09-25 04:49:37

标签: php security validation user-input

我在方法调用,SQL查询和文件调用中使用$_GET$_POST$_COOKIE变量 - 为了更好的安全性,必须转义/重写此用户数据(避免注射攻击等)。您如何推荐这样做?

内置逃生功能的一些想法......让果汁流动:

  • 将反斜杠添加到:\x00, \n, \r, \, ', "\x1a以使字符串对SQL查询安全 - 就像在mysql_real_escape_string()中一样。
  • 将接受的字符数限制为[a-zA-Z0-9 _-\.](其中“\.”是转义的“。” - 点)。

您的意见非常感谢。感谢。

3 个答案:

答案 0 :(得分:1)

由于转义依赖于您发送数据的系统,我的建议是使用PHP提供的功能,专门为每个系统创建。

例如:

无论哪种方式:不要重新发明轮子!

对于许多类型的输出已经存在转义函数/方法:使用它们!

答案 1 :(得分:0)

另请注意,您必须逃脱的某些事情(如果用户输入)是图像位置等

如果有人用这个链接到图像(例如头像)

  

http://yoursite.com/admin/user/delete/1

然后您视图中的代码是

<img class="avatar" alt="<?php echo $userName; ?>" src="<?php $avatarUrl; ?>" />

如果您以管理员身份登录,则可能会意外删除用户。当然,希望这种删除是通过帖子完成的,但它仍然可以被规避。

在这种情况下,htmlspecialchars()无济于事。

您可以通过强制执行所有数据更改方法来使攻击者更难以使用帖子,并且您可以通过为每个删除操作生成令牌并在删除之前对其进行验证来使其变得几乎不可能。

答案 2 :(得分:0)

我正在使用这样:

function escape($sql) {
    // Stripslashes
    if (get_magic_quotes_gpc()) {
        $sql = stripslashes($sql);
    }
    //if this is the intedger
    if (!is_int($sql) || $sql == '0') {
        $sql = "'" . mysql_real_escape_string($sql) . "'";
    }
    return $sql;
}

在MySQL查询中

mysql_query("SELECT SQL_CACHE * FROM `page` WHERE `id` = ".escape($_GET['id'])." LIMIT 1");