标签: sql-injection

存储过程可以防止 SQL 注入吗?

存储过程真的可以防止针对 PostgreSQL 数据库的 SQL 注入攻击吗?我做了一点研究,发现即使我们只使用存储过程,SQL Server、Oracle 和 MySQL 也不能安全地抵御 SQL 注入。但是,这个问题在 PostgreSQL 中不存在。

PostgreSQL 核心中的存储过程实现是防止 SQL 注入攻击还是其他什么?或者即使我们只使用存储过程,PostgreSQL 是否也容易受到 SQL 注入的影响?如果是这样,请给我举个例子(例如书籍、网站、论文等)。

postgresql security sql-injection

85
推荐指数
5
解决办法
1万
查看次数

Postgres 函数中的 SQL 注入与准备好的查询

在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入机制
一种方法比另一种方法有什么特别的优势吗?

postgresql sql-injection prepared-statement plpgsql functions

37
推荐指数
1
解决办法
2万
查看次数

如何将笑脸插入 MySQL ( )

我在 MySQL 5.5.21 上,并尝试插入 '\xF0\x9F\x98\x8A' 笑脸字符。但是对于我的生活,我不知道该怎么做。

根据我一直在阅读的各种论坛,这是可能的。但是每当我尝试时,数据都会被截断。

mysql> INSERT INTO hour  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  
       `indegree` ,  `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   
       VALUES ( "title" ,  "content   content" ,  "guid" ,  1,  1,   
                     "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level   | Code | Message                                                                       |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 …
Run Code Online (Sandbox Code Playgroud)

mysql sql-injection character-set

20
推荐指数
1
解决办法
5万
查看次数

为什么 SQL 注入不会发生在存储过程中的这个查询上?

我做了以下存储过程:

ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100))
AS
SELECT ActorDOB, ActorName FROM tblActor
WHERE ActorName LIKE '%' + @nameString + '%'
AND ActorGender = @actorgender
Run Code Online (Sandbox Code Playgroud)

现在,我尝试做这样的事情。也许我做错了,但我想确保这样的过程可以防止任何 SQL 注入:

EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor'
Run Code Online (Sandbox Code Playgroud)

下图显示了在 SSMS 中执行的上述 SQL 并且结果显示正确而不是错误:

在此处输入图片说明

顺便说一句,我在查询完成后在分号后面添加了那部分。然后我再次执行它,但是当我检查表 tblActor 是否存在时,它仍然存在。难道我做错了什么?或者这真的是防注射的吗?我想我在这里也想问的是,这是一个像这样安全的存储过程吗?谢谢你。

sql-server-2008 security sql-server sql-injection dynamic-sql

18
推荐指数
1
解决办法
3654
查看次数

有没有什么办法可以在oracle中不使用单引号的情况下跳出字符串并注入SQL?

我正在测试一个基于 oracle 的应用程序,我发现了以下代码:

查询 = "从员工中选择姓名 WHERE id='"+PKID+"';"

即查询字符串包含直接从 URL 获得的 PKID 值周围的引号。

显然,这是一个等待发生的经典 SQL 注入......除了应用程序位于 CA SiteMinder 之后,它会阻止任何带有单引号(任何形式)的 URL 传递给应用程序。

有没有办法在不使用单引号的情况下打破字符串并注入SQL?

编辑:对不起,我应该更清楚 - 我理解它应该如何写,但我需要说服人们这是一个可利用的问题。目前,因为它在阻止单引号的 siteminder 后面,所以这将是一个低优先级的修复。

oracle sql-injection

12
推荐指数
2
解决办法
2161
查看次数

什么函数在带有 SQL Server 的动态 sql 中引用标识符?

什么是用于动态 sql 生成的安全引用标识符的 SQL Server 方法。

我如何确保为动态生成的语句提供动态生成的列名,该列本身不是 SQL 注入攻击。

假设我有一个 SQL 语句,

SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud)

本质上与

'SELECT [' + $col + '] FROM table;'
Run Code Online (Sandbox Code Playgroud)

什么可以阻止注入攻击

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";
Run Code Online (Sandbox Code Playgroud)

导致

SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud)

security sql-server sql-injection

11
推荐指数
1
解决办法
1311
查看次数

这个 SQL 过程是“防注入”吗?

大多数 SQL 注入的答案和示例都显示某种形式的动态 SQL 或将参数解释为 SQL。

我还没有找到“正确”方式的例子。Microsoft 和 Oracle 的文档仅显示了不应做什么的示例。

因此,我想我应该询问这个存储过程示例是否受到 SQL 注入攻击的保护。

CREATE PROCEDURE test
    @username = varchar(30)
    @password = varchar(30)
AS
BEGIN
    SELECT *
    FROM credentials
    WHERE username = @username
    AND password = @password;
END
GO
Run Code Online (Sandbox Code Playgroud)

这个特定的过程是否容易受到 SQL 注入的影响?我创建了该过程并通过各种尝试注入 SQL 来执行它,例如EXEC test @password = '0; drop table credentials;',但无法这样做。我想我可能没有正确地进行攻击。

security sql-server sql-injection t-sql

10
推荐指数
2
解决办法
2622
查看次数

我们还应该使用 QUOTENAME 来防止注入攻击吗?

我今天正在查看一个旧的存储过程,并注意到它quotename在输入参数上使用。在做了一些挖掘以弄清楚它到底做了什么之后,我发现了这个站点。我现在了解它的作用以及如何使用它,但该站点表示它被用作 SQL 注入攻击的缓解措施。当我过去使用 asp.net 开发直接查询数据库的应用程序时,我会使用 ADO.Net 参数将用户输入作为文字值传入,而从不真正担心在我的存储过程中保护它。

我现在正在编写一个存储过程,该过程将由我不编写的应用程序使用,因此我确实需要尝试在过程级别防止注入攻击,这是quotename最好的方法还是有更新的功能/更好的方法?

让我了解这种思维模式的代码(@parm1是用户输入参数):

'SELECT project [Project], project_desc [Description], 
        customer [Customer], cpnyid [Company]
FROM PJPROJ (nolock)
where project like ' + quotename(@parm1,'''') + '
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-injection t-sql

9
推荐指数
1
解决办法
3028
查看次数

应该在 SQL 语句中指定日期格式吗?

我看到开发人员使用隐式日期转换的代码。我想要一个明确的答案,为什么他们不应该这样做。

SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
Run Code Online (Sandbox Code Playgroud)

oracle sql-injection

8
推荐指数
2
解决办法
2223
查看次数

使用带参数的 sp_executesql 如何防止 SQL 注入?

以下是使用sp_executesql的动态过滤解决方案

IF OBJECT_ID(N'dbo.GetOrders', N'P') IS NOT NULL DROP PROC dbo.GetOrders;
GO
CREATE PROC dbo.GetOrders
 @orderid AS INT = NULL,
 @custid AS INT = NULL,
 @empid AS INT = NULL,
 @orderdate AS DATE = NULL
AS
DECLARE @sql AS NVARCHAR(1000);
SET @sql = 
 N'SELECT orderid, custid, empid, orderdate, filler'
 + N' /* 27702431-107C-478C-8157-6DFCECC148DD */'
 + N' FROM dbo.Orders'
 + N' WHERE 1 = 1'
 + CASE WHEN @orderid IS NOT NULL THEN
 N' AND orderid = @oid' ELSE N'' END …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-injection dynamic-sql

8
推荐指数
2
解决办法
3021
查看次数