Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当我生成sql脚本而不是直接访问数据库时,如何防止sql注入漏洞?_Php_Sql_Postgresql_Sql Injection_Sql Scripts - Fatal编程技术网

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

Php 当我生成sql脚本而不是直接访问数据库时,如何防止sql注入漏洞?,php,sql,postgresql,sql-injection,sql-scripts,Php,Sql,Postgresql,Sql Injection,Sql Scripts,对于我的工作,我需要生成一个sql脚本,用于从json文件更新数据库中的一些值,如下所示: $jsonContents=file_get_contents('./myfile.json'); $jsonContents=json_decode($jsonContents, true); $script=""; foreach($jsonContents['data'] as $element) { $script.="UPDATE mytable SET element='{$eleme

对于我的工作,我需要生成一个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。

通常许多数据库管理系统都有sql代码来生成准备好的语句: 例如,对于Postgresql,这里是:

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

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

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

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

$script.=";";

file_put_contents('./script.sql',$script);
因此,在这种情况下,您需要手动生成正确的查询来执行准备好的查询,而不是依赖PDO来执行。还应考虑使用
$
分隔符,以避免roque
'
弄乱更新

类似地,对于mysql,您可以使用以下查询格式:


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

通常许多数据库管理系统都有sql代码来生成准备好的语句: 例如,对于Postgresql,这里是:

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

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

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

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

$script.=";";

file_put_contents('./script.sql',$script);
因此,在这种情况下,您需要手动生成正确的查询来执行准备好的查询,而不是依赖PDO来执行。还应考虑使用
$
分隔符,以避免roque
'
弄乱更新

类似地,对于mysql,您可以使用以下查询格式:



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

您的代码没有任何保护措施,考虑一个包含单个引用的值,以及如何生成SQL。这甚至不是SQL注入问题。我会向要求你编写剧本的人澄清你的担忧,让他们(知情的)对潜在问题做出决定(并以书面形式得到答案)。问题是如何生成sql注入安全脚本,因为一旦生成sql脚本,我就无法访问PDO提供的准备好的语句。您需要使用特定于数据库的转义函数转义值,例如
mysqli\u real\u escape\u string
。问题是,它们也不是100%安全的,但要使它们有机会甚至远程可靠地工作,您需要与要插入数据的数据库建立活动数据库连接。那么…这可能吗?很可能不是,对吧?他们中的许多人也需要一个连接处理程序。@Raymond抱歉,暂时忽略了标记。用适当的PergRes等效替换…你的代码不能保护任何东西,考虑一个包含单个引用的值,以及如何生成SQL。这甚至不是SQL注入问题。我会向要求你编写剧本的人澄清你的担忧,让他们(知情的)对潜在问题做出决定(并以书面形式得到答案)。问题是如何生成sql注入安全脚本,因为一旦生成sql脚本,我就无法访问PDO提供的准备好的语句。您需要使用特定于数据库的转义函数转义值,例如
mysqli\u real\u escape\u string
。问题是,它们也不是100%安全的,但要使它们有机会甚至远程可靠地工作,您需要与要插入数据的数据库建立活动数据库连接。那么…这可能吗?很可能不是,对吧?他们中的许多人也需要一个连接处理程序。@Raymond抱歉,暂时忽略了标记。替换为相应的Postgres等效项…一旦创建文件,您最终会遇到相同的漏洞。PREPARE函数将清理您正在保存的字符串,但在执行实际更新时,您仍需要再次准备该字符串。Ok该漏洞存在,恶意开发人员可以手动编辑sql脚本,但在这种情况下,您也可以使用手动非编码方法来进行编辑。例如,让一名负责人或两名开发人员在同一台pc上执行脚本,甚至让一个安全的CCER/DPO先检查脚本等等。我唯一能想到的是--(注释指示器)可能会弄乱我的脚本。假设你没有恶意的开发人员/管理员或不负责任的人,或者没有一天的时间犯错误的人,这应该是安全的。。如果确实需要,您可以在其上编程加密/解密层,以防止其在生产RDM上运行,直到该安全官员/DPO验证存在非恶意代码,并向该导入提供其密码以在其pc上加密和执行。或者根据其上的证书权限处理该导入(一些值得信赖的人)PostgreSQL用户,这似乎是一个更好的主意。一旦创建文件,您最终会遇到相同的漏洞。PREPARE函数将清理您正在保存的字符串,但在实际更新时,您仍需要再次准备。确定该漏洞存在,恶意开发人员可以手动编辑sql脚本,但我在这种情况下,您也可以使用手动非编码方法来执行此操作。例如,让一名负责人或两名开发人员在同一台pc上执行脚本,甚至让安全性为CCER/DPO的人先检查脚本,等等。我唯一做不到的事情就是