提问人:ÁEDÁN 提问时间:3/22/2017 更新时间:6/13/2022 访问量:856
删除非字母数字字符可以防止 SQL 注入吗
Can removing non-alphanumeric characters prevent SQL Injection
问:
想象一个简单的查询:
Declare @sql varchar(100)
Declare @table varchar(20)
Set @table = 'foo'
select @sql = 'select * from ' + @table
exec(@sql)
这将正常工作,直到有人将@table更改为类似“sys.tables;下拉表栏'
但是我想知道,如果@table从中删除了所有非字母数字字符,是否还会发生SQL注入?在此示例中,恶意@table将 = 'systablesdroptablebar'。
现在我知道使用sp_executesql和参数化 SQL 是最佳实践。所以不要给我任何垃圾!我很好奇,删除所有非字母数字字符的字符串如何被破坏以提供 SQL 注入有效负载。
为清楚起见,此代码块将在 Microsoft SQL Server 2008 或更高版本中执行。
答:
1赞
ѺȐeallү
3/22/2017
#1
对于你的案例,我没有很好的妥协例子,但我可以告诉你我如何尝试防御性地针对它进行编程......
考虑将表访问权限列入白名单
也许您可以限制对特定表子集的访问。理想情况下,这些表遵循通用的命名方案,以便可以根据该方案验证表名。
如果不能将表名列入白名单,则至少可以通过查询系统表来检查数据库中是否存在提供的表名。
sys.tables
对于 SQL Server,应将表名放在方括号中
SELECT COUNT(*) FROM [" + tableName + "]"
这个关于SQL注入的资源将彻底回答你的问题:OWASP备忘单
评论
0赞
ÁEDÁN
3/22/2017
你能详细解释一下为什么我应该用 [] 包装表名吗?它能为我提供什么?
1赞
S3S
3/23/2017
@AndrewNieuwsma,因为它会导致错误。假设 @table = 'users;drop table dbo.users;--' 则执行将是 'SELECT COUNT(*) FROM [users; drop table dbo.users;--',因此,缺少右括号。另请参阅 msdn.microsoft.com/en-us/library/ms176114.aspx
0赞
ѺȐeallү
3/23/2017
@AndrewNieuwsma Yeapers...西蒙是对的。注入将导致查询错误而不是执行...
评论
db_owner
db_datareader
db_datawriter
drop
db_owner