• PHP防止sql注入-JS注入


    一:为了网站数据安全,所有和数据库操作的相关参数必须做相关过滤,防止注入引起的网站中毒和数据泄漏

    1.PHP自带效验函数

      mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

      受影响的字符串:x00、 、 、、'、"、x1a

    ==>攻击实例

    <?php
    $con = mysql_connect("localhost", "hello", "321");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
    
    $sql = "SELECT * FROM users
    WHERE user='{$_POST['user']}'
    AND password='{$_POST['pwd']}'";
    mysql_query($sql);
    
    // 不检查用户名和密码
    // 可以是用户输入的任何内容,比如:
    $_POST['user'] = 'john';
    $_POST['pwd'] = "' OR ''='";
    
    
    mysql_close($con);
    ?>

    上面代码的结果是:SELECT * FROM users WHERE user='john' AND password='' OR ''=''。这就意味着不用密码可以自由登入系统。

    ==>简单的参数效验

     1 <?php
     2 function check_input($value)
     3 {
     4 // 去除斜杠
     5 if (get_magic_quotes_gpc())
     6   {
     7   $value = stripslashes($value);
     8   }
     9 // 如果不是数字则加引号
    10 if (!is_numeric($value))
    11   {
    12   $value = "'" . mysql_real_escape_string($value) . "'";
    13   }
    14 return $value;
    15 }
    16 
    17 $con = mysql_connect("localhost", "hello", "321");
    18 if (!$con)
    19   {
    20   die('Could not connect: ' . mysql_error());
    21   }
    22 
    23 // 进行安全的 SQL
    24 $user = check_input($_POST['user']);
    25 $pwd = check_input($_POST['pwd']);
    26 $sql = "SELECT * FROM users WHERE
    27 user=$user AND password=$pwd";
    28 
    29 mysql_query($sql);
    30 
    31 mysql_close($con);
    32 ?>

    ==>防止js注入

    例如:http://url?act="<script>XXXXXX</script>",要确保参数的正确性,我们需要过滤掉PHP标签

     1 <?php
     2 function check_input($value)
     3 {
     4 // 去除斜杠
     5 if (get_magic_quotes_gpc())
     6   {
     7   $value = stripslashes($value);
     8   }
     9 
    10 //过滤掉html标签
    11 $value = strip_tags($value);
    12 
    13 // 如果不是数字则加引号
    14 if (!is_numeric($value))
    15   {
    16   $value = "'" . mysql_real_escape_string($value) . "'";
    17   }
    18 return $value;
    19 }
    20 
    21 $con = mysql_connect("localhost", "hello", "321");
    22 if (!$con)
    23   {
    24   die('Could not connect: ' . mysql_error());
    25   }
    26 
    27 // 进行安全的 SQL
    28 $user = check_input($_POST['user']);
    29 $pwd = check_input($_POST['pwd']);
    30 $sql = "SELECT * FROM users WHERE
    31 user=$user AND password=$pwd";
    32 
    33 mysql_query($sql);
    34 
    35 mysql_close($con);
    36 ?>

    二:总结

      要完全防止sql注入,我们要从源头上做起,接收到的参数可以控制参数类型,对参数进行转义等等,转义常用的有如下几种

      A,用addslashes()函数转义。  
      B,用pdo对象的quote()方法:$pdo->quote($var);进行转义
      C,在执行sql语句用prepare() 。$pdo->prepare($sql),prepare()默认对变量进行转义的

  • 相关阅读:
    springboot + websocket + qpid问题记录
    学习开源项目guns遇到的问题记录
    CSS选择器和jQuery选择器学习总结
    (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
    (深入.Net平台和C#编程)第九章.上机练习.20170417
    (深入.Net平台和C#编程)第八章.上机练习(网络电视精灵).20170415
    (深入.Net平台和C#编程)第十章.课程总复习.20170413
    (深入.Net平台和C#编程)第七章.上机练习.20170412
    (深入.Net平台和C#编程)第六章.简答题5.20170410
    (深入.Net平台和C#编程)第六章.简答题3.20170410
  • 原文地址:https://www.cnblogs.com/kafeijiu/p/3181781.html
Copyright © 2020-2023  润新知