当我生成 sql 脚本而不是直接访问数据库时,如何防止 sql 注入漏洞?

How I can prevent the sql injection vulnerability when I generate sql scripts instead of directly accessing the database?

为了我的工作,我需要生成一个 sql 脚本来从 json 文件更新数据库中的一些值,如下所示:

$jsonContents=file_get_contents('./myfile.json');
$jsonContents=json_decode($jsonContents, true);

$script="";

foreach($jsonContents['data'] as $element)
{
  $script.="UPDATE mytable SET element='{$element['value']}' where id={$element['id']};";
}

file_put_contents('./script.sql',$script);

所以我想知道一旦 sql 脚本被执行,sql 注入的危险是否潜伏在周围,或者将数据原封不动地放入 sql 脚本中是安全的?如果在某些情况下 sql 注入威胁潜伏着,我如何才能使我的脚本 sql 注入安全?

请记住,我被要求提供一个 sql 脚本,而不是直接访问数据库并使用 php 更新值。在后一种情况下,我可以只使用 PDO 和准备好的语句。

数据库层是postgresql。

通常许多 DBMS 都有 sql 代码来生成准备好的语句: 例如。对于 Postgresql,这里是:https://www.postgresql.org/docs/current/sql-prepare.html

因此您可以将脚本更改为:

$jsonContents=file_get_contents('./myfile.json');
$jsonContents=json_decode($jsonContents, true);

$script="PREPARE myquery (text,int) AS UPDATE mytable SET element= where id=;EXECUTE myquery";

foreach($jsonContents['data'] as $element)
{
  $script.="($${$element['value']}$$,{$element['id']})";
}

$script.=";";

file_put_contents('./script.sql',$script);

所以在这种情况下,您需要手动生成正确的查询来执行准备好的查询,而不是依赖 PDO 来执行此操作。还要考虑使用 $$ 分隔符以避免 roque ' 弄乱你的更新。

对于mysql similary你可以使用以下查询格式:https://dev.mysql.com/doc/refman/5.7/en/sql-prepared-statements.html

如果您动态生成查询,则需要根据情况创建多个准备好的语句,例如 $element['value'] 是一个逗号分隔值,需要拆分成块,每个值代表一个不同的列。