如何强制PostgreSQL将输出放在引号中?

时间:2017-01-04 19:49:29

标签: bash postgresql

我有以下代码:

$sql = "copy(" . $sql . ") TO STDOUT CSV HEADER" ;
$cmd = "psql -h " . DATABASE_HOST . " -d " . DATABASE_NAME . " -U " . DATABASE_USER . " -c '" . $sql . ";' > " . WEBUSER_DOWNLOAD_PATH . $archivo_csv ;

我希望输出包含引号内的值,例如" name"," age",...," any"。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

OOF。好的,首先:这可能是一个糟糕的模式。例如,考虑$sql是" DELETE FROM users) TO STDOUT; COPY (SELECT * FROM profiles"时会发生什么。或者,因为您发出了bash命令,例如" SELECT 1) TO STDOUT;" rm -rf /"。基本上,此代码模式容易受到SQL InjectionShell Injection问题的影响。

也就是说,COPY命令现在有a bunch of options。你可以使用类似的东西:

COPY (query) TO STDOUT WITH (FORMAT CSV, HEADER, FORCE_QUOTE *);

我假设您正在使用相对最新版本(9.0或更高版本)的postgres。如果您使用的是旧版本,则可能仍然没问题。从8.0开始,旧语法上有FORCE QUOTE选项。