我有以下代码:
$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"。
我该怎么做?
答案 0 :(得分:0)
OOF。好的,首先:这可能是一个糟糕的模式。例如,考虑$sql
是" DELETE FROM users) TO STDOUT; COPY (SELECT * FROM profiles
"时会发生什么。或者,因为您发出了bash命令,例如" SELECT 1) TO STDOUT;" rm -rf /
"。基本上,此代码模式容易受到SQL Injection和Shell Injection问题的影响。
也就是说,COPY
命令现在有a bunch of options。你可以使用类似的东西:
COPY (query) TO STDOUT WITH (FORMAT CSV, HEADER, FORCE_QUOTE *);
我假设您正在使用相对最新版本(9.0或更高版本)的postgres。如果您使用的是旧版本,则可能仍然没问题。从8.0开始,旧语法上有FORCE QUOTE选项。