首页 > 数据库 >无涯教程-SQL - Injection(注入)

无涯教程-SQL - Injection(注入)

时间:2024-01-16 20:31:53浏览次数:37  
标签:CUSTOMERS name SQL 无涯 查询 mysql query Injection

如果您通过网页输入用户输入并将其插入到SQL数据库中,则可能会遇到因 SQL注入而引起的安全问题。本章将教您如何防止这种情况的发生,并帮助您保护服务器端脚本(如PERL脚本)中的脚本和SQL语句。

在下面的示例中,名称限于字母数字字符加下划线,并且长度介于8到20个字符之间(根据需要修改这些规则)。

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
   $result=mysql_query("SELECT * FROM CUSTOMERS 
      WHERE name=$matches[0]");
} else {
   echo "user name not accepted";
}

为了演示问题,请考虑以下摘录-

//supposed input
$name="Qadir'; DELETE FROM CUSTOMERS;";
mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'");

该函数调用应该从CUSTOMERS表中检索一条记录,其中name列与用户指定的名称匹配。在正常情况下, $name 仅包含字母数字字符,可能还包含空格,如字符串ilia。但是在这里,通过在$name后面附加一个全新的查询,对数据库的调用变成了灾难,注入的DELETE查询将从CUSTOMERS表中删除所有记录。

幸运的是,如果使用MySQL,则 mysql_query()函数不允许查询堆栈或在单个函数调用中执行多个SQL查询,如果您尝试堆叠查询,则调用将失败。

但是,其他PHP数据库扩展(如 SQLite 和 PostgreSQL )执行了堆栈查询,执行了一个字符串中提供的所有查询,并造成了严重的安全问题。

防止SQL注入

您可以使用PERL和PHP等脚本语言来巧妙地处理所有转义字符,PHP的MySQL扩展提供了 mysql_real_escape_string()函数,以转义MySQL特有的输入字符。

if (get_magic_quotes_gpc()) {
   $name=stripslashes($name);
}
$name=mysql_real_escape_string($name);
mysql_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

LIKE 语句

为了解决LIKE难题,自定义转义机制必须将用户提供的'%'和'_'字符转换为文字。使用 addcslashes(),该函数可让您指定要转义的字符范围。

$sub=addcslashes(mysql_real_escape_string("%str"), "%_");
//$sub ==\%str\_
mysql_query("SELECT * FROM messages 
   WHERE subject LIKE '{$sub}%'");

参考链接

https://www.learnfk.com/sql/sql-injection.html

标签:CUSTOMERS,name,SQL,无涯,查询,mysql,query,Injection
From: https://blog.51cto.com/u_14033984/9277240

相关文章

  • sql server 判断是否存在数据库,表,列,视图
    1判断数据库是否存在ifexists(select*fromsys.databaseswherename='数据库名')    dropdatabase[数据库名]2判断表是否存在ifexists(select*fromsysobjectswhereid=object_id(N'[表名]')andOBJECTPROPERTY(id,N'IsUserTable')=1)    droptabl......
  • sql数据类型有哪些?
    1、二进制数据类型。二进制数据包括Binary、Varbinary和ImageBinary数据类型既可以是固定长度的(Binary),也可以是变长度的。Binary[(n)]是n位固定的二进制数据。其中,n的取值范围是从1到8000。其存储空间的大小是n+4个字节。Varbinary[(n)]是n位变长度的二进制数......
  • SQL编码规范
    ......
  • 无涯教程-SQL - Sequences(序列)
    序列是按需生成的一组整数1、2、3,...。序列在数据库中经常使用,因为许多应用程序要求表中的每一行都包含唯一值。本章介绍如何在MySQL中使用序列。AUTO_INCREMENT列MySQL中使用序列的最简单方法是将一列定义为AUTO_INCREMENT,其余部分留给MySQL处理。试试下面的例子,这将创建一......
  • SQLite的帮助类
    由于sqlserver安装复杂,维护困难,对于存储一些简单的数据,使用SQLite无疑是个好的选择经过我的了解,我发现无论是SQLSERVER,还是MySQL,还是SQLite,他们的关键词都是大差不差的比如SQLSERVER的connection关键词就是SqlConnection,SQLite的就是SQLiteConnection今天是第一次使用SQLite,写了个......
  • 无涯教程-SQL - SubQueries(子查询)
    子查询或内部查询或嵌套查询是另一个SQL查询中的查询,并嵌入在WHERE子句中。SubQueries-语法子查询最常与SELECT语句一起使用。基本语法如下-SELECTcolumn_name[,column_name]FROMtable1[,table2]WHEREcolumn_nameOPERATOR(SELECTcolumn_name[,column......
  • MYSQL8以上修改初始root密码的方法
    很遗憾的告诉你,你网上查到的各种改my.enf,各种update,在新版MYSQL中,统统失效。解决方法,如下:1.[root@yisu-5f735cb14d716~]#servicemysqldstartRedirectingto/bin/systemctlstartmysqld.service[root@yisu-5f735cb14d716~]#mysql-vWelcometotheMySQLmonitor.Comm......
  • Mysql8忽略大小写的解决方案
    一、删除服务器数据文件由于8.0没法设置参数后重启(失败),所以必须删掉老库,重新启动才行。切记:;本步骤要删掉老库所有资料,如果是数据库当前有用,请做好备份,再进行操作。systemctlstopmysqldcd/var/lib/mysql默认数据在这里rm-rf*二、添加配置,大小写不敏感vim/etc/my.cnflow......
  • Abp vnext FreeSql 生成模板,并提供下载模板接口
    DtoDto设置参考[ExcelImporter(IsLabelingError=true)]publicclassMyDto{ [ImporterHeader(Name="序号")] [ExporterHeader(DisplayName="序号")] publicintId{get;set;}}Controller生成模板[HttpGet("GenerateTemplate")]//[Wr......
  • nextjs使用prisma连接MySQL
      第一步npminstall@prisma/client 第二步npxprismainit 生成了文件 第三步,修改文件内容 第四步 第五步测试一下,执行npxprismadbpull我里面有一个user表的,拉下来这样显示了 ......