在使用动态 SQL 的函数中使用参数时,在 PostgreSQL 中实现通配符搜索的正确方法是什么?
作为起点,以下是 Erwin Brandstetter 在 stackoverflow 上回答不同问题的示例:
CREATE OR REPLACE FUNCTION report_get_countries_new (starts_with text
, ends_with text = NULL)
RETURNS SETOF lookups.countries AS
$func$
DECLARE
sql text := 'SELECT * FROM lookups.countries WHERE country_name >= $1';
BEGIN
IF ends_with IS NOT NULL THEN
sql := sql || ' AND country_name <= $2';
END IF;
RETURN QUERY EXECUTE sql
USING starts_with, ends_with;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
假设country_name您想要进行前导和尾随通配符搜索。
例如,不使用参数,AND country_name LIKE '%ic%'.
在这种情况下,在否定 …
我将如何引用类型名称以防止 SQL 注入。例如,拿这个
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
^ Quote this
Run Code Online (Sandbox Code Playgroud)
这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
format
----------------------------------------------------------
SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)
我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。
我很懒惰,宁愿参数化一次(以获得名称的 object_id)并Invoke-SqlCmd用于其余工作。
给定一系列用于处理任意服务器对象的函数,下面的测试是否足以确认 CmdletBinding 输入参数Int32防止通过用户提供的方式注入$object_id?
function foo {
[CmdletBinding()]Param(
[Int32]$object_id
)
$query = "select type_desc from sys.objects where object_id = $object_id;"
Invoke-Sqlcmd -ServerInstance "localhost" -Database "tempdb" -Query $query
}
foo 3
foo "0 union all select name from sys.syslogins where sid = 0x01"
foo $null
foo ([math]::Pow(2,31)+1)
foo @(1,2)
Run Code Online (Sandbox Code Playgroud) TDE通过将文件恢复到另一台服务器来防止对数据的未授权访问,因为它需要原始加密证书和主密钥。
如果我使用 TDE 对我的数据库应用了表级加密,并通过正确的身份验证从我的 Windows 应用程序访问数据库。考虑到入侵者正在尝试某种注入技术,我的问题是他收到的是原始数据还是加密数据?或者我们可以使用TDE as an anti-injection technique吗?我的应用程序中的查询可能如下所示:
Dim myQuery="Select * from myTable where some_id='" & txtUserId.Text & "'
Run Code Online (Sandbox Code Playgroud)
这样他们就可以通过提供像sameValue' or 1=1 or '将提供整个数据的文本来注入 sql 。在这种情况下,他是得到加密数据还是实际数据
注意:我不在我的应用程序中使用此类查询,而是在整个应用程序中使用参数化查询和 sp。要求这只是为了澄清。
sql-server sql-injection encryption transparent-data-encryption
我正在尝试学习“SQL 注入”概念,并尝试练习一些 Kali 工具来学习,但有一个我不明白的问题,我的问题是为什么大多数工具都需要以“AAA.BBB?id”结尾的 URL? =000" 作为注入的输入字符串。
是否有一种既定的方法或工具可用于仅通过测试它发送到数据库的查询来对应用程序执行渗透测试?
例如,如果我有一堆 SQL Server 托管各种网站,并且通过一个未参数化的查询,有没有办法检测到这些?
可能不安全的示例查询:
SELECT x,y,z FROM logins WHERE username = 'xx' and password = 'yyy'
Run Code Online (Sandbox Code Playgroud)
...相反,我希望一个安全的应用程序可能正在使用sp_executesql.
sql-server ×4
dynamic-sql ×2
postgresql ×2
datatypes ×1
encryption ×1
plpgsql ×1
powershell ×1
security ×1