PHP防止sql注入-JS注入

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

1.PHP自带效验函数

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

受影响的字符串:\x00、\n、\r、\、'、"、\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()默认对变量进行转义的