假定字符串参数中包含用户输入。基于用户输入生成的 SQL 命令字符串易于受到 SQL 注入式攻击。在 SQL 注入式攻击中,恶意用户提供将更改查询设计的输入,以试图破坏基础数据库或获取对基础数据库的未经授权的访问权限。典型的方法包括注入单引号或省略号(它们都是 SQL 文本字符串分隔符)、两个短划线(表示 SQL 注释)和一个分号(指示后面有新命令)。如果用户输入必须是查询的一部分,请使用下面按有效性顺序列出的方法之一来降低攻击风险。
使用存储过程。
使用参数化命令字符串。
在生成命令字符串之前针对类型和内容验证用户输入。
示例:
#using <SystemDatadll>
#using <SystemEnterpriseServicesdll>
#using <SystemTransactionsdll>
#using <SystemXmldll>using namespace System;using namespace System::Data;using namespace System::Data::SqlClient;namespace SecurityLibrary
{ public ref class SqlQueries
{ public:
Object^ UnsafeQuery(
String^ connection, String^ name, String^ password)
{
SqlConnection^ someConnection = gcnew SqlConnection(connection);
SqlCommand^ someCommand = gcnew SqlCommand();
someCommand->Connection = someConnection;
someCommand->CommandText = String::Concat( "SELECT AccountNumber FROM Users WHERE Username='",
name, "' AND Password='", password, "'");
someConnection->Open();
Object^ accountNumber = someCommand->ExecuteScalar();
someConnection->Close(); return accountNumber;
}
Object^ SaferQuery(
String^ connection, String^ name, String^ password)
{
SqlConnection^ someConnection = gcnew SqlConnection(connection);
SqlCommand^ someCommand = gcnew SqlCommand();
someCommand->Connection = someConnection;
someCommand->Parameters->Add( "@username", SqlDbType::NChar)->Value = name;
someCommand->Parameters->Add( "@password", SqlDbType::NChar)->Value = password;
someCommand->CommandText = "SELECT AccountNumber FROM Users "
"WHERE Username=@username AND Password=@password";
someConnection->Open();
Object^ accountNumber = someCommand->ExecuteScalar();
someConnection->Close(); return accountNumber;
}
};
}using namespace SecurityLibrary;void main()
{
SqlQueries^ queries = gcnew SqlQueries();
queries->UnsafeQuery(Environment::GetCommandLineArgs()[1],
"' OR 1=1 --", "anything"); // Resultant query (which is always true):
// SELECT AccountNumber FROM Users WHERE Username='' OR 1=1
queries->SaferQuery(Environment::GetCommandLineArgs()[1],
"' OR 1 = 1 --", "anything"); // Resultant query (notice the additional single quote character):
// SELECT AccountNumber FROM Users WHERE Username=''' OR 1=1 --'
// AND Password='anything'}
以上就是关于检查Sql 查询中是否有安全漏洞全部的内容,包括:检查Sql 查询中是否有安全漏洞、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)