我必须逃避哪些字符才能在平面文件数据库中使用?

时间:2011-12-13 11:53:47

标签: php database-design escaping

在用户输入到flatfile数据库时,我需要转义哪些字符?我已经对类型进行了明确的测试,但是我知道可以将代码注入数据库或用于更改查询。

那么在我存储用户输入之前,我必须逃避哪些字符?

欢迎其他安全建议,因为我可能遗漏了一些东西。

阅读评论后,这是我的功能:

    private function cleanInput($input) {
        switch($this->_config->delimiter()) {
            case '\"';
            case '"';
            case '\\';
            case '\0';
                break;
            default;
                $input = addslashes($input);
        }               
        $output = preg_quote($input, $this->_config->delimiter());
        return $output;
    }

2 个答案:

答案 0 :(得分:0)

不同的数据库引擎需要转义不同的字符(但大多数字符串类似于单引号')。对于未知数据库,您可以使用addslashes() PHP函数。

  

强烈建议使用DBMS特定的转义功能(例如   MySQL mysqli_real_escape_string()pg_escape_string()   PostgreSQL),但如果您使用的DBMS没有逃脱   函数和DBMS使用\来转义特殊字符,你可以使用它   功能

答案 1 :(得分:0)

您需要逃避的内容取决于您对数据的处理方式。如果您只是以这种格式将数据转储到flatfile中:

foo,bar,baz
foo1,bar1,baz1

然后显然,和换行符是存储格式中的重要字符。因此,您需要在值本身中转义任何,或换行符。

还有一个问题是你如何插入数据。如果你只是使用fwrite($fh, $data)转储它,那就没有什么可以逃脱的了。如果您正在为平面文件后端使用某些类似SQL的前端,则需要转义可能连接到SQL查询中的任何值以保持SQL语法有效。

只有在其他字符串中嵌入文本字符串时才需要转义数据,有些字符具有特殊含义并且您不希望这些特殊字符 value 字符串可触发任何特殊操作。在这种情况下,您需要转义任何可能具有特殊含义的字符。