避免Sql注入攻击

2023-12-11

我有一个 ASP.NET 应用程序。其中我有这段代码:

 using (Data.connexion)
    {
        string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =@login and mdp=@mdp";
        SqlCommand command = new SqlCommand(queryString, Data.connexion);
        command.Parameters.AddWithValue("@login", _login);
        command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
        try
        {
            SqlDataReader reader = command.ExecuteReader();
            do
            {
                while (reader.Read())
                {
                    return View("Success");
                }
            } while (reader.NextResult());

        }
        catch {  }
    }

当我尝试使用此登录进行 Sql 注入攻击时'' or 1=1 --,攻击失败。但如果我改变这个片段:

 using (Data.connexion)
            {
                string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =" + _login + " and mdp=" + _password.GetHashCode().ToString();
                SqlCommand command = new SqlCommand(queryString, Data.connexion);
              //  command.Parameters.AddWithValue("@login", _login);
               // command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
                try
                {
                    SqlDataReader reader = command.ExecuteReader();
                    do
                    {
                        while (reader.Read())
                        {
                            return View("Success");
                        }
                    } while (reader.NextResult());

                }
                catch {  }
            }

我被重定向到视图success这样攻击就成功了。

这两种编码方式有什么区别?预防和避免 Sql 注入攻击的最佳方法是什么?


防止 SQL 注入的最佳方法是使用参数化查询。

You can将值连接到字符串时确保安全,但必须完全正确,并且具体方法因数据库品牌而异。

对于 SQL Server,您可以通过将字符串中的任何撇号加倍来对字符串值进行编码。这样,任何撇号都会被数据库正确解释,并且不可能使用撇号来打破字符串:

string queryString = "select id_user, nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login = '" + _login.Replace("'","''") + "' and mdp = '" + _password.GetHashCode().ToString().Replace("'","''") + "'";

但是,使用参数化查询仍然更容易,然后数据库驱动程序会为您完成此操作。如果您尝试自己处理编码,但没有得到正确的结果,那么您就陷入了困境worse地方,因为您认为问题已得到解决,但它可能很容易受到 SQL 注入攻击。


旁注:String.GetHashCode方法不适合哈希密码之类的事情。该方法的实现将来可能会发生变化(就像过去一样),这将使数据库中的所有散列密码变得无用。

“不要序列化哈希码值或将它们存储在数据库中。” -- http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免Sql注入攻击 的相关文章

随机推荐

  • href 链接中的 laravel 方法?

    我想创建一个带有两个链接的下拉菜单 删除 和 编辑 链接 对于删除功能 我创建了一个表单 Former horizontal open gt method DELETE gt action action Test TestControlle
  • 转换unix时间戳php

    我有一个数据库来存储我的时间 我使用 PHP 插入它 date Y m d H i s 然后我使用这个函数将其转换为 PHP 中的 unix 时间戳 function convert datetime str list date time
  • 线程 - wait()

    The wait 对象上的方法只能在同步上下文中调用 即当前线程必须拥有对象上的锁才能调用wait 方法 现在如果线程 T1 拥有对象上的锁 obj 并调用其 wait 方法obj wait 其他线程如何获得该对象的锁定 obj 这样他们也
  • 为什么Eclipse将maven运行时依赖变成编译依赖?

    我有一个 Maven 项目导入到 Eclipse Oxygen 中 Eclipse 报告没有编译问题 Alt F5 当我从命令行运行 Maven 时 我得到 ERROR home dean src TAP3UIs TAP3Desktop s
  • 我尝试在不同线程上使用 OpenGL 和 Windows API

    所以基本上我正在使用窗口 API创建一个空窗口 然后我使用OpenGL从不同的线程绘制到该窗口 我设法做到了这一点仅用一根线程 但是获取和分派系统消息以使窗口可用会减慢我能够获得的帧速率 因此我试图在主线程中绘制时让另一个线程并行执行此操作
  • 加号解码为空格

    我从 ios 和 android 发送请求到一些 PHP 服务器 并且 GET 请求中的一些参数被错误解码 request http myserver com path email john doe GET email john doe i
  • --no-ff merge 如何打破平分和指责?

    了解 Git 工作流程文章说 因此 您添加了一条新规则 当您合并功能分支时 请使用 no ff 强制进行新的提交 这样就完成了工作 然后你就可以移动了 在 然后有一天 您在生产中发现了一个严重的错误 并且您需要 追踪它的推出时间 你跑平分但
  • PHP:无法从 DOMDocument 中删除节点

    我无法从 DOMDocument 中删除节点 获取异常 My Code
  • matplotlib/seaborn 中时间直方图中的轴刻度

    我有一个 df 其中包含来自 WhatsApp 聊天的消息 发件人以及日期时间格式的相应时间 Time Sender Message 2020 12 21 22 23 00 Sender 1 2020 12 21 22 26 00 Send
  • 使用 Discord.py 在一条消息中发送多个嵌入内容

    我一直在尝试使用discord py 在一条消息中发送嵌入列表 我在discord py的文档中看到这是可能的 https discordpy readthedocs io en latest api html 发送 内容 无 等待 假 用
  • 为什么 C++ 中不存在成员引用?

    在 C 中 我可以在函数指针和函数引用之间进行选择 甚至为了完整性而选择函数值 void call function pointer void function function void call function reference v
  • 将文本文件中的数字读取到二维数组

    尽管这里有很多例子 但我似乎无法让它工作 我有一个文本文件 包含许多行 每行都有三个 int 值 用一个空格分隔 例如 1 0 0 0 0 0 1 0 1 0 0 2 1 0 2 我正在尝试将其读入二维数组 到目前为止我的代码 int ma
  • Laravel:如何在视图刀片中解析此 json 数据?

    目前这是我的观点 leads 这是输出 error false member id 1 firstName first lastName last phoneNumber 0987654321 email email protected o
  • 小程序上的 iframe 闪烁

    我正在使用 iFrame 在我的在线游戏中通过 Applet 显示内容 它在 Safari Chrome Firefox Opera 等浏览器中完美运行 但在 Windows 上的 Internet Explorer 中却始终无法正常运行
  • 流式传输实时数据时,Worksheet_Change 不会启动

    我读过很多关于这个主题的帖子 但是似乎没有什么适合我的场景 我想Call Sub单元格更改后 B2 其中包含来自外部源的实时数据馈送 last updated Private Sub Worksheet Change ByVal Targe
  • 如何将十进制数转换为固定位数的二进制数

    我想将数字从 0 转换为 15 如下所示 0000 0001 0010 0011 1111 问题是 当我们将 2 转换为二进制数时 它只给出二进制的 10 但我想将 2 转换为 4 位二进制数 0010 这段代码应该可以满足您的需求 For
  • 与以下使用数组更新运算符 $[] 的查询等效的 MongoDB C# 驱动程序是什么

    From https docs mongodb com manual reference operator update positional filtered up S 3标识符 3E 给定以下集合 id 1 grades grade 8
  • 用于连接两个媒体容器(视频和音频流)的 Gstreamer 管道

    我是 gstreamer 的初学者 正在努力使用 Gstreamer 1 0 的管道来无缝连接两个 MP4 媒体容器 这两个容器都包含视频和音频流 在我看来 使用 concat 元素是最方便的方法 我可以连接任一视频流 gst launch
  • Amazon Keyspaces 不支持的分区程序(适用于 Apache Cassandra)

    我有一个 Java Spring 应用程序并且正在使用Amazon Keyspaces 适用于 Apache Cassandra 我正在使用sigv4 插件 版本 4 0 2 cassandra java driver core 版本 4
  • 避免Sql注入攻击

    我有一个 ASP NET 应用程序 其中我有这段代码 using Data connexion string queryString select id user nom prenom mail login mdp last visite