当我生成 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']
是一个逗号分隔值,需要拆分成块,每个值代表一个不同的列。
为了我的工作,我需要生成一个 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']
是一个逗号分隔值,需要拆分成块,每个值代表一个不同的列。