Delphi考虑sql注入 QuotedStr

Delphi考虑sql注入 QuotedStr之前只在BS架构的项目中考虑了Sql注入问题,却很少考虑到用了多年的Delphi项目也应该考虑Sql注入的问题,今天做了个实验,成功完成注入,把表里数据全部删除,以后再做Delphi项目还真的考虑这个问题。总体讲,大体知道有两种方式可以避免Delphi中的Sql注入:1、用QuotedStr替代”’进行字符串拼接;2、采用传参数的方式与数据库交互,这种方式哪天再仔细体验一下。 以下为一个小测试,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

之前只在BS架构的项目中考虑了Sql注入问题,却很少考虑到用了多年的Delphi项目也应该考虑Sql注入的问题,今天做了个实验,成功完成注入,把表里数据全部删除,以后再做Delphi项目还真的考虑这个问题。

总体讲,大体知道有两种方式可以避免Delphi中的Sql注入:1、用QuotedStr替代”’进行字符串拼接;2、采用传参数的方式与数据库交互,这种方式哪天再仔细体验一下。

 

以下为一个小测试,一个简单的插入语句,如果Edit1内容为
abc’) delete from tb1 insert into tb1(Id, Name) values(123, ‘xxxx
则运行后,tb1表中之前数据将全部清除,只剩下insert into tb1(Id, Name) values(123, ‘xxxx
添加的一条

 

[delphi] 
view plain
copy

 

  1. procedure TForm1.Button1Click(Sender: TObject);  
  2. var  
  3.   sqlStr: String;  
  4. begin  
  5.   sqlStr := ‘insert into tb1(Id, Name) values(1, ‘” + edit1.Text + ‘)’;  
  6.   self.ADOQuery1.SQL.Text := sqlStr;  
  7.   self.ADOQuery1.ExecSQL;  
  8.   ShowMessage(‘成功完成Sql注入’);  
  9. end;  

 

 

改成sqlStr := ‘insert into tb1(Id, Name) values(1, ‘ + QuotedStr(edit1.Text) + ‘)’;

则可避免。

 

QuotedStr参考如下语句: 

adoquery1.sql.text:=
‘select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123′;
等价于
adoquery1.sql.text:=
‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName
+’=”’+AStr+”’ and 整型编号=’+AnIntStr;
也等价于
adoquery1.sql.text:=
‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName
+’=’+QuotedStr(AStr)+’ and 整型编号=’+Inttostr(AnInt);
传到数据库服务器为:
select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180794.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • StringUtils的isBlank(), isEmpty(), isNotBlank(), isNotEmpety(), isNoneBlank(), isNoneEmpty()[通俗易懂]

    StringUtils的isBlank(), isEmpty(), isNotBlank(), isNotEmpety(), isNoneBlank(), isNoneEmpty()[通俗易懂]isBlank()方法把空格当做没有,而isEmpty()认可空格的存在.StringUtils.isEmpty(null)=trueStringUtils.isEmpty(“”)=trueStringUtils.isEmpty(”“)=false//注意在StringUtils中空格作非空处理StringUtils.isEmpty(”“)=fal……

    2022年8月12日
    9
  • FDD和TDD区别

    FDD和TDD区别转载链接:https://www.jianshu.com/p/496291b4aa2e

    2022年5月17日
    36
  • 基于RDP开源许可rdesktop基本介绍

    基于RDP开源许可rdesktop基本介绍

    2022年1月4日
    57
  • python lambda表达式举例_Python中lambda表达式[通俗易懂]

    python lambda表达式举例_Python中lambda表达式[通俗易懂]一、lambda表达式形式lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。冒号前是参数,冒号后是返回值。lambda是一个表达式而不是一个语句。lambda表达式可以出现在Python语法不允许def出现的地方。lambda表达式返回一个值。二、与def的区别lambda用来编写简单的函数,不会再重复利用的函数。而def用来处理强大的任务。三、举例1、fun=lambdax…

    2022年10月10日
    0
  • 什么是窗口句柄

    什么是窗口句柄什么是窗口句柄举个例子:你有你自己的身份证号,一报身份证号,你应该知道是你了你也有名字,当然名字复杂点,并且不是唯一,没有数字来得方便,所以,窗口句柄就相当于身份证号,每个窗口都有一个编号

    2022年7月1日
    22
  • PCI和PCIE插槽有什么区别?[通俗易懂]

    PCI和PCIE插槽有什么区别?[通俗易懂]PCI是PeripheralComponentInterconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。PCI插槽也是主板带有最多数量的插槽类型,在目前流行的台式机主板上,ATX结构的主板一般带有5~6个PCI插槽,而小一点的MATX主板也都带有2~3个PCI插槽,可见其应用的广泛性。PCI是由Intel公司1991年推出的一

    2022年6月29日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号