防SQL注入_晴天的blog的博客-程序员秘密

技术标签: sql注入  

1.必须认定用户输入的数据都是不安全的

用户输入的数据进行过滤处理

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

让我们看下在没有过滤特殊字符时,出现的SQL情况:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。

在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。

防止SQL注入,我们需要注意以下几个要点:

  • 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
  • 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  • 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  • 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
  • 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
  • 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

防止SQL注入

在脚本语言,如Perl和PHP你可以对用户输入的数据进行转义从而来防止SQL注入。

PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。

if (get_magic_quotes_gpc()) 
{
   
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Like语句中的注入

like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。

在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes() 函数在指定的字符前添加反斜杠。

语法格式:

addcslashes(string,characters)


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/oReadBook/article/details/79537820

智能推荐

【Cordic】基于Cordic算法的NCO的设计实现_fpga和matlab的博客-程序员秘密

1.软件版本ISE14.72.本算法理论知识ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐。其基本思想是通过一系列逐次递减的、与运算基数相关的往复偏摆以逼近最终需要达到的旋转角度。该算法仅利用加法和移位两种运算通过迭代方式进行矢量旋转, CORDIC算法由于只采用加法和移位运算,因此很适合在FPGA中实现,它可以用来实现数字下变频中的NCO、混频器和坐标变换等功能。 实现NCO的另一种方法是采用基于坐标旋转数字式计算机的算...

黑马程序员——Socket的学习_weixin_30337251的博客-程序员秘密

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------今天学习了socket,学习做了一个聊天的软件,其中用到了多线程和socket的知识。现在总结一下。创建监听服务端Socketfuwu=fuwu=newSocket(AddressFam...

NetworkOnMainThreadException异常_banyuan2288的博客-程序员秘密

解决办法:在发起Http请求的Activity里面的onCreate函数里面添加如下代码: StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork()...

【日常学习】STL之map_ametake的博客-程序员秘密

对map最初的印象,源于王建德老师在山东NOIP夏令营上那销魂的一句“map,i,j”(音:唛颇,挨,杰= =)ruka上对map并没有讲很多,TY菌说map主要用来写哈希(虽然她曾用它写过邻接矩阵= =循环嵌套map intOrz),而李晨和里奥甚至表示基本不用map。但是既然有这一项奇妙的东西,想必是有用的,把前两节学的总结一下。map是一个映射,也称关联数组,是一周关联式容器。和

Observer -对象行为型模式_kingSolider的博客-程序员秘密

        1.意图            定义对象间的一种一对多的关系,当一个对象的状态发生改变的时候,所有依赖            它的对象都得到通知。            2.参与者            Subject -目标知道它的观察者                    -提供注册和删除它的观察者            Observer -为那些在目标中发生改变...

使用Spark对日志进行简单的文本解析_Stark_xhz的博客-程序员秘密

使用Spark对日志进行简单的文本解析 原日志格式: 从hdfs上读取日志文件:val rdd = sc.textFile("hdfs://master:9000/spark/localhost_access_log.2015-04-24.txt") 过滤不正确的数据并且将日期合并:rdd.map(_.split(" ")).filter(_.length == 10).map(x =

随便推点

.NET Core是什么?_weixin_34265814的博客-程序员秘密

【初步理解】.NET Core 是一个开源的、跨平台的 .NET 实现。而 .NET Framework 是基于 Windows 的 .NET 实现,Mono 是.NET Framework 的一个开源、跨平台的实现。.NET Core 分为两大块:1).NET Core Framework,2).NET Core Runtime。.NET Core Framework...

CentOS 6.4 编译安装 MySQL-5.6_baiyangliu的博客-程序员秘密

环境:CentOS-6.4-x86_64-minimalmysql-5.6.12.tar.gzyum -y install make gcc-c++ cmake bison-devel ncurses-develgroupadd mysqluseradd -g mysql mysqlcurl -o mysql-5.6.12.tar.gz http://cd

mvc:annotation-driven mvc:default-servlet-handler和 ontext:component-scan base-package三者的关系_keepons的博客-程序员秘密

<mvc:annotation-driven />mvc:default-servlet-handler/和 <context:component-scan base-package=“com”></context:component-scan>三者之间的关系1.<context:component-scan base-package=“com

解决TIME_WAIT状态常见的解决办法_time_wait setsockopt_wpfbcr的博客-程序员秘密

TIME_WAIT状态:  在TCP连接中,主动关闭链接的一方会进入TIME_WAIT状态,它会保持长达2MSL周期的时间,为什么会保持这么长的时间上一篇博客中已经提到过了。如果server的最后一次ACKclient没有收到,client会重新发送一次fin这个时间是在2ML周期之间的,这个时候server还保持着TIME_WAIT的状态所以它会再次发送ACK确认,而如果不等待这么长时间的话,s

echarts折线图拐点处hover变色_echarts itemstyle hover变色_Wang某人的博客-程序员秘密

效果图:emphasis:{ itemStyle:{ color:'#14E2FF', borderColor:'#14E2FF' //如果borderColor颜色不与color一致,则拐点处会有边框 } }

推荐文章

热门文章

相关标签