首页 > 技术文章 > 路径+DataRow+SqlParameters防止SQL注入

ZkbFighting 2017-12-29 10:55 原文

 

绝对路径:是从盘符开始的路径,形如
C:\windows\system32\cmd.exe
相对路径:是从当前路径开始的路径,假如当前路径为C:\windows
要描述上述路径,只需输入
system32\cmd.exe
实际上,严格的相对路径写法应为
.\system32\cmd.exe
其中,.表示当前路径,在通道情况下可以省略,只有在特殊的情况下不能省略。

Session 的用法是什么?

简单说就是保存用户信息的
给你打个比方吧,就比如你在百度这里问问题,当你首先登入的时候,你的名字等等就要写入到session;
session("name")=request.form("name")
这样的话,当你从登入的首页转到它的子页,你的名字就还有效,
你有没有看见上面”我的提问,我的回答等等”  可以直接跳转,不用验证
否则的话,也就是你不用session,当你登入首页,再转到子页,你就等于没登入,你又要重新登入啦.
知道了吗,
也就是说,session是用来记录你的进程信息的,

 

SqlParameter 作用就是防止有特殊字符。一般情况下用于往存储过程传参
--其实我还没找到为啥防止特殊字符:比较起来好像是:sql字符串拼接,是直接拼接出来的,导致where后面恒成立
--通过SqlParamrter 是传入的值,不是直接拼接到sql语句上的,,有待考证

SqlParameter方法的原理呢:
就是参数化查询时用户输入的参数仅作为参数而永远不会作为查询语句的一部分
什么意思呢?直白的讲,
参数化之后,用户输入的东西仅仅是SQL语句的参数,
在执行的时候加上 '' 它仅仅作为参数,不会变成SQL逻辑语句的一部分。


一般来说,在更新DataTable或是DataSet时,
如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,
如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。

 

DataRow 是用来表示一个数据表的的数据行,所以,它不能单独new,
因为一行记录,需要有架构(架构就是描述这一行都有哪些列,分别是什么数据类型,甚至索引字段是哪个,有无约束等)。
所以DataRow有需要在有架构的情况下,才可以创建。
所以,你必须要先构造一个DataTable,然后才能在相应的DataTable上创建一行

 

示例代码:Columns 列

DataTable memTable = new DataTable( "tableName" );
memTable.Columns.Add( new DataColumn( "ID", typeof( int ) ) );
memTable.Columns.Add( new DataColumn( "Username", typeof( string ) );
memTable.Columns.Add( new DataColumn( "Password", typeof( Guid ) );

DataRow row = memTable.NewRow();
row[ "ID" ] = 1;
row[ "Username" ] = "badbug";
row[ "Password" ] = Guid.NewGuid();

memTable.Rows.Add( row );

 

推荐阅读