PHP+mysql防止SQL注入的方法小结

本文实例讲述了PHP+mysql防止SQL注入的方法。分享给大家供大家参考,具体如下:

SQL注入

例:脚本逻辑

$sql = "SELECT * FROM user WHERE userid = $_GET[userid] ";

案例1:

代码如下:

SELECT * FROM t WHERE a LIKE '%xxx%' OR (IF(NOW=SYSDATE(), SLEEP(5), 1)) OR b LIKE '1=1 ';

案例2:

代码如下:

SELECT * FROM t WHERE a > 0 AND b IN(497 AND (SELECT * FROM (SELECT(SLEEP(20)))a) );

案例3:

代码如下:

SELECT * FROM t WHERE a=1 and b in (1234 ,(SELECT (CASE WHEN (5=5) THEN SLEEP(5) ELSE 5*(SELECT 5 FROM INFORMATION_SCHEMA.CHARACTER_SETS) END)) );

监控以下方法

SLEEP() — 一般的SQL盲注都会伴随SLEEP()函数出现,而且一般至少SLEEP 5秒以上
MID()
CHAR()
ORD()
SYSDATE()
SUBSTRING()
DATABASES()
SCHEMA()
USER()
VERSION()
CURRENT_USER()
LOAD_FILE()
OUTFILE/DUMPFILE
INFORMATION_SCHEMA
TABLE_NAME
fwrite()/fopen()/file_get_contents() — 这几个是PHP文件操作函数

应对方法:

1.mysql_escape_string() 转义特殊字符((PHP 4 >= 4.3.0, PHP 5))(mysql_real_escape_string必须先链接上数据库,否则会报错)

下列字符受影响:

\x00 //对应于ascii字符的NULL
\n  //换行符且回到下一行的最前端
\r //换行符
\ //转义符
'
"
\x1a  //16进制数

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

2.addslashes(): 函数返回在预定义字符之前添加反斜杠的字符串 (stripslashes()实现字符串还原)

预定义的字符有:

单引号(')
    双引号(")
    反斜杠(\)
    NULL

3.prepared  statements(预处理机制)

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
 echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
/* Non-prepared statement */
if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {
 echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
 echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 2: bind and execute */
$id = 1;
if (!$stmt->bind_param("i", $id)) {
 echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
 echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
?>

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php程序设计安全教程》、《php安全过滤技巧总结》、《PHP运算与运算符用法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • php+mysql注入页面实现

    首先来借鉴一下注入点,以往的注入点是这样的http://www.xxx.com/show.php?id=1,典型的数字型注入. $id=$_GET['id'];//获取GET方式传过来的值并赋值给变量 既然是注入那么肯定要操作数据库. $con = mysql_connect('127.0.0.1','root','root');//使用connect这个函数来连接数据库,然后赋值给变量,connect这个函数有三个 参数分别是数据库地址,账号,密码. mysql_select_db('数据库名

  • PHP中防止SQL注入方法详解

    问题描述: 如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子: 复制代码 代码如下: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')"); 因为用户的输入可能是这样的: 复制代码 代码如下: value');

  • PHP MYSQL注入攻击需要预防7个要点

    1:数字型参数使用类似intval,floatval这样的方法强制过滤. 2:字符串型参数使用类似mysql_real_escape_string这样的方法强制过滤,而不是简单的addslashes. 3:最好抛弃mysql_query这样的拼接SQL查询方式,尽可能使用PDO的prepare绑定方式. 4:使用rewrite技术隐藏真实脚本及参数的信息,通过rewrite正则也能过滤可疑的参数. 5:关闭错误提示,不给攻击者提供敏感信息:display_errors=off. 6:以日志的方式

  • Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷.而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险. PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连

  • php中$_GET与$_POST过滤sql注入的方法

    本文实例讲述了php中$_GET与$_POST过滤sql注入的方法,分享给大家供大家参考.具体分析如下: 此函数只能过滤一些敏感的sql命令了,像id=1这种大家还是需要自己简单过滤了. 主要实现代码如下: 复制代码 代码如下: if (!get_magic_quotes_gpc()) { if (!empty($_GET)) { $_GET  = addslashes_deep($_GET); } if (!empty($_POST)) { $_POST = addslashes_deep($

  • 防止MySQL注入或HTML表单滥用的PHP程序

    MySQL注入的意图是接管网站数据库并窃取信息.常见的开源数据库,如MySQL,已经被许多网站开发人员用来储存重要信息,如密码,个人信息和管理信息. MySQL之所以流行,是因为它与最流行的服务器端脚本语言PHP一起使用.而且,PHP是主导互联网的Linux- Apache服务器的主要语言.因此,这意味着黑客可以很容易地利用PHP就像Windows的间谍软件一样. 黑客向一个无担保的网页表单输入大量恶意代码(通过下拉菜单,搜索框,联系表单,查询表单和复选框). 恶意代码将被送到MySQL数据库,

  • php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击

    php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击 php防止SQL注入攻击一般有三种方法: 使用mysql_real_escape_string函数 使用addslashes函数 使用mysql bind_param() 本文章向大家详细介绍这三个方法在防止SQL注入攻击中的效果及区别. mysql_real_escape_string防sql注入攻击 mysql_real_escape_string() 函数转义 SQL 语句中

  • PHP简单实现防止SQL注入的方法

    本文实例讲述了PHP简单实现防止SQL注入的方法.分享给大家供大家参考,具体如下: 方法一:execute代入参数 <?php if(count($_POST)!= 0) { $host = 'aaa'; $database = 'bbb'; $username = 'ccc'; $password = '***'; $num = 0; $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password

  • PHP简单预防sql注入的方法

    本文实例讲述了PHP简单预防sql注入的方法.分享给大家供大家参考,具体如下: 出现sql注入一般都是因为语法不规范不严谨造成的,问题出现在sql语句上,而起决定性的是quote(').如下: $sql = "delete from table where id ='$id'" ; 正常提交的话就是删除一条数据,若id提交的是(1 ' or 1 #),那么sql语句就变成了 delete from table where id = '1'or 1 #'; 这样的话就会把整个表给删掉,造

  • PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】

    本文实例讲述了PHP实现表单提交数据的验证处理功能.分享给大家供大家参考,具体如下: 防XSS攻击代码: /** * 安全过滤函数 * * @param $string * @return string */ function safe_replace($string) { $string = str_replace('%20','',$string); $string = str_replace('%27','',$string); $string = str_replace('%2527',

随机推荐