在用户输入平面文件数据库时需要转义哪些字符?我已经针对类型进行了显式测试,但我知道代码可能被注入数据库或用于更改查询。
那么在存储用户输入之前,我必须转义哪些字符?
欢迎其他安全建议,因为我可能遗漏了一些东西。
阅读评论后,这是我的功能:
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;
}
需要转义的内容取决于您对数据所做的操作。如果您只是将数据以以下格式转储到平面文件中:
foo,bar,baz
foo1,bar1,baz1
显然,,
和换行符是存储格式中的重要字符。因此,您需要转义值本身中的任何,
或换行字符。
还有一个问题是如何插入数据。如果你只是用fwrite($fh, $data)
倾倒它,没有什么可以逃脱。如果您在平面文件后端使用一些类似SQL的前端,则需要转义可能连接到SQL查询中的任何值,以保持SQL语法有效。
转义数据仅在您将文本字符串嵌入到其他字符串中时才需要,有一些字符具有特殊含义,您不希望这些特殊字符在值字符串中触发任何特殊操作。在这种情况下,您需要转义任何可能具有特殊含义的字符。
不同的数据库引擎需要转义不同的字符(但大多数类似于单引号'
)。对于未知数据库,可以使用addslashes() PHP函数。
强烈建议使用DBMS特定的转义函数(例如:MySQL为mysqli_real_escape_string(), MySQL为pg_escape_string()PostgreSQL),但如果您正在使用的DBMS没有转义函数和DBMS使用'来转义特殊字符,您可以使用它函数。