用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止sql注入或xss攻击等问题。
推荐:【
PHP教程
】
一、防止SQL注入
什么是SQL注入攻击?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
立即学习
“
PHP免费学习笔记(深入)
”;
寻找SQL注入的方法:
1.通过get请求
2.通过post请求
3.其他http请求,如cookie
常见的SQL注入问题:
数据库查询参数的类型转换处理
1. 转义字符处理不当
Talk is cheap,Show me the code.
多说无益,代码亮出来吧!
测试:
在下边的网址后边加一个单引号,就会报数据库错误
http://testphp.vulnweb.com/ar...
2. 类型处理不当
Mysql内置了一个命令,可以读取文件
该命令会获取数据库管理员的密码。
处理方法:
需要将客户端传过来的数据进行类型强制转换,而后再查询
3. 查询语句组织不当
4. 错误处理不当
即将站点的错误信息暴漏给用户,这样非常危险。
数据入库时将转换单引号、双引号、反斜杠为实体
在入库的时候如果不过滤 ' ""这样的东西,这样会使数据库报错,或者注入等问题。
先将字符串用htmlspecialchars()转换为实体后存储到数据库,然后从数据库读出来时htmlspecialchars_decode()转为HTML标签。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
函数原型:
预定义的字符是:
htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符(和htmlspecialchars相反)。
函数原型:
二、防止xss攻击
什么是xss攻击?
和上边的sql注入不同的是,xss攻击是合法的字符串,如经过htmlspecialchars()方法实体化后,可以保存在数据库中,但是,当访问含有该字符串的内容页面时,就会出现问题,如字符串里边还有JavaScript,frame代码,原来的页面就会被篡改。
比如你写个留言本,有人去留言写zuojiankuohao
php
cnscript src="xx">
// 构造动态SQL语句
$sql = "select * from tbl where field = '$_GET['input']'";
// 执行SQL语句
$res = mysql_query($sql);// 构造动态SQL语句
$sql = "select * from tbl where field = $_GET['user_id']";
// 执行SQL语句
$res = mysql_query($sql);Union all select load_file('/etc/passwd')--
select * from tbl where userid = 1 union all select load_file('etc/passwd')--$user_id = (int)$_GET['user_id'];
"select * from tbl where userid = {$user_id}";user.php?table=user&// 构造动态查询语句
$getid = "select * from tbl where userid > 1";
// 执行SQL语句
$res = mysql_query($getid) or die(''.mysql_error().'
');
5. 多个提交处理不当
// 参数是否是一个字符串
if(is_string($_GET["param"])){}htmlspecialchars(string,quotestyle,character-set)& (和号) 成为 &
” (双引号) 成为 "
‘ (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >htmlspecialchars_decode(string,quotestyle)