欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-30 09:55:47
本文实例讲述了php+mysql防止sql注入的方法。分享给大家供大家参考,具体如下: sql注入 例:脚本逻辑 $sql = "select * from...

本文实例讲述了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程序设计有所帮助。