动态生成的 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 查询的安全性的主要内容,如果未能解决你的问题,请参考以下文章

Jfinal适用于条件查询的动态SQL语句生成工具

Oracle 在执行动态生成的 SQL 查询时进行扩展

Cglib根据数据库表数据动态生成对象

MyBatis学习动态SQL语句

对表使用 sql server 2005 同义词会导致动态查询生成错误

8SQL语言