一:为了网站数据安全,所有和数据库操作的相关参数必须做相关过滤,防止注入引起的网站中毒和数据泄漏
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()默认对变量进行转义的