动态生成的 sql 查询的安全性
Posted
技术标签:
【中文标题】动态生成的 sql 查询的安全性【英文标题】:Security with dynamically generated sql query 【发布时间】:2019-10-24 14:08:19 【问题描述】:我正在创建一个侧边栏搜索(通过单击选项),并选择单击的变量以创建 sql 查询。
更具体地说: 1. 用户在侧边栏中选择选项。 2. 我根据这些选择创建 str(作为要调用的 url),将参数添加为 'param1=value&'... 3. ajax调用php controller->model->query dababase based on params via $_GET.
我最后使用准备好的语句,但理论上攻击者可以组成自己的 url。为避免这种情况,我预先指定了允许的值($keysArr),如果 $_GET 变量不存在,则脚本将终止。也只需将 int() 添加到预期的数值,因此如果不是 int,php 将抛出错误。
$keysArr = ['x', 'y', 'z'];
foreach ($ArrfromGET as $key => $value)
if (!in_array($key, $keysArr))
die("don't attack me");
我这样做正确吗? 搜索是基于动态生成的值,所以我不知道该怎么做。代码基于(https://www.w3schools.com/js/js_ajax_database.asp);
【问题讨论】:
可以使用@parameter查询 我从来没见过,这个概念怎么称呼?我需要阅读更多相关信息。 【参考方案1】:你可以试试这个。
注意,我只是展示如何在 SQL 中保护动态查询
DECLARE @ParameterDefinition NVARCHAR(MAX)
SET @ParameterDefinition = '
@P_Name NVARCHAR(50)
, @P_Address NVARCHAR(50)';
DECLARE @SQL NVARCHAR(MAX);
DECLARE @Name NVARCHAR(50) = '' //set here value
DECLARE @Address NVARCHAR(50) = '' //set here value
SET @SQL = 'SELECT * FROM USER WHERE Name = @P_Name OR Address = @P_Address'
EXECUTE sp_executesql @SQL, @ParameterDefinition,
@P_Name = @Name,
@P_Address = @Address
【讨论】:
我从来没见过,这个概念怎么称呼?我需要阅读更多相关信息。 更多详情请点击link 这只是在查询中传递的参数,我们在存储过程调用时设置了值,这里我们传递实际值并避免SQL injection
以上是关于动态生成的 sql 查询的安全性的主要内容,如果未能解决你的问题,请参考以下文章