存储过程真的可以防止针对 PostgreSQL 数据库的 SQL 注入攻击吗?我做了一点研究,发现即使我们只使用存储过程,SQL Server、Oracle 和 MySQL 也不能安全地抵御 SQL 注入。但是,这个问题在 PostgreSQL 中不存在。
PostgreSQL 核心中的存储过程实现是防止 SQL 注入攻击还是其他什么?或者即使我们只使用存储过程,PostgreSQL 是否也容易受到 SQL 注入的影响?如果是这样,请给我举个例子(例如书籍、网站、论文等)。
在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入的机制?
一种方法比另一种方法有什么特别的优势吗?
postgresql sql-injection prepared-statement plpgsql functions
我在 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) 我做了以下存储过程:
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
我正在测试一个基于 oracle 的应用程序,我发现了以下代码:
查询 = "从员工中选择姓名 WHERE id='"+PKID+"';"
即查询字符串包含直接从 URL 获得的 PKID 值周围的引号。
显然,这是一个等待发生的经典 SQL 注入......除了应用程序位于 CA SiteMinder 之后,它会阻止任何带有单引号(任何形式)的 URL 传递给应用程序。
有没有办法在不使用单引号的情况下打破字符串并注入SQL?
编辑:对不起,我应该更清楚 - 我理解它应该如何写,但我需要说服人们这是一个可利用的问题。目前,因为它在阻止单引号的 siteminder 后面,所以这将是一个低优先级的修复。
什么是用于动态 sql 生成的安全引用标识符的 SQL Server 方法。
quote_identifierquote_ident我如何确保为动态生成的语句提供动态生成的列名,该列本身不是 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) 大多数 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;',但无法这样做。我想我可能没有正确地进行攻击。
我今天正在查看一个旧的存储过程,并注意到它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) 我看到开发人员使用隐式日期转换的代码。我想要一个明确的答案,为什么他们不应该这样做。
SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
Run Code Online (Sandbox Code Playgroud) 以下是使用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-injection ×10
security ×4
sql-server ×4
dynamic-sql ×2
oracle ×2
postgresql ×2
t-sql ×2
functions ×1
mysql ×1
plpgsql ×1