T-SQL 括号单引号和 sql 注入 [重复]

T-SQL brackets single quote and sql injection [duplicate]

提问人:kofifus 提问时间:5/2/2018 更新时间:5/2/2018 访问量:367

问:

考虑:

CString username="john['dow";
CString password="mypass";
ExecSQL("CREATE LOGIN ["+username+"] WITH PASSWORD = '"+password+"', CHECK_POLICY = OFF, DEFAULT_DATABASE = Voyager, CHECK_EXPIRATION = OFF"));

(其中 ExecSQL 在 SQL Server 数据库上执行 SQL)

使用括号作为用户名,因为它可能包含一个点

我检查密码不包含单引号(但我知道它可以安全地包含任何其他字符?

我检查用户名不包含右括号。

有没有其他字符对用户名不安全?特别是在这种情况下,左括号或单引号对用户名不安全吗?

谢谢

sql-server t-sql sql 注入

评论

1赞 Mitch Wheat 5/2/2018
不要连接字符串。使用参数
0赞 kofifus 5/2/2018
可以在没有 CREATE LOGIN 存储过程的情况下完成吗?如何?
1赞 Damien_The_Unbeliever 5/2/2018
最安全的方法是根本不考虑逃跑。但是由于我们不能参数化,这似乎是一条死胡同。或者是吗?当前(外部)代码是什么语言?它是否具有绑定到 .NET 程序集的方法?如果是这样,SQL 管理对象似乎是要走的路。CREATE LOGIN
0赞 Zohar Peled 5/2/2018
请注意,这是您之前问题的重复,也是重复的。

答:

-1赞 DEEPAK LAKHOTIA 5/2/2018 #1

仔细阅读本文,它将为您提供用户名和密码的最佳实践:

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-login-transact-sql?view=sql-server-2017#arguments

Login_name指定创建的登录名的名称。有四种类型的登录名:SQL Server 登录名、Windows 登录名、证书映射登录名和非对称密钥映射登录名。创建从 Windows 域帐户映射的登录名时,必须使用 Windows 2000 之前的用户登录名,格式为 [\]。不能使用 login_name@DomainName 格式的 UPN。有关示例,请参阅本主题后面的示例 D。SQL Server 身份验证登录名的类型为 sysname,必须符合标识符的规则,并且不能包含“\”。Windows 登录名可以包含“\”。基于 Active Directory 用户的登录名限制为少于 21 个字符的名称。

密码 ='password'仅适用于 SQL Server 登录名。指定正在创建的登录名的密码。您应该使用强密码。有关详细信息,请参阅强密码和密码策略。从 SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server

密码区分大小写。密码长度应始终至少为 8 个字符,并且不能超过 128 个字符。密码可以包括 a-z、A-Z、0-9 和大多数非字母数字字符。密码不能包含单引号或login_name。

密码 =hashed_password适用范围:SQL Server 2008 到 SQL Server 2017。

仅适用于 HASHED 关键字。指定正在创建的登录名的密码的哈希值。

评论

0赞 kofifus 5/2/2018
谢谢 Deepak,据我了解,在 Windows 服务器上,创建 SQL Server 密码时适用 Windows 密码复杂性策略?
0赞 DEEPAK LAKHOTIA 5/2/2018
我无法对此发表评论,因为我完全不知道创建 Windows 帐户密码的复杂性要求,但如果它与上述相同,那么是的。希望它有所帮助。如果它回答了您的原始问题,请将其标记为答案。