Php 当我生成sql脚本而不是直接访问数据库时,如何防止sql注入漏洞?
对于我的工作,我需要生成一个sql脚本,用于从json文件更新数据库中的一些值,如下所示: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
$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的人先检查脚本,等等。我唯一做不到的事情就是