php安全问题思考

用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止SQL注入或xss攻击等问题。

一、防止SQL注入

什么是SQL注入攻击?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

寻找SQL注入的方法:

1.通过get请求

2.通过post请求

3.其他http请求,如cookie

常见的SQL注入问题:

数据库查询参数的类型转换处理

1. 转义字符处理不当

  // 构造动态SQL语句  $sql = "select * from tbl where field = '$_GET['input']'";  // 执行SQL语句  $res = mysql_query($sql);

测试:
在下边的网址后边加一个单引号,就会报数据库错误
http://testphp.vulnweb.com/ar...

2. 类型处理不当

// 构造动态SQL语句$sql = "select * from tbl where field = $_GET['user_id']";// 执行SQL语句 $res = mysql_query($sql);

Mysql内置了一个命令,可以读取文件

  1. 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}";

3. 查询语句组织不当

user.php?table=user&

4. 错误处理不当

即将站点的错误信息暴漏给用户,这样非常危险。

// 构造动态查询语句$getid = "select * from tbl where userid > 1";// 执行SQL语句$res = mysql_query($getid) or die(''.mysql_error().'');

5. 多个提交处理不当

// 参数是否是一个字符串if(is_string($_GET["param"])){}

数据入库时将转换单引号、双引号、反斜杠为实体

在入库的时候如果不过滤 ' ""这样的东西,这样会使数据库报错,或者注入等问题。

先将字符串用htmlspecialchars()转换为实体后存储到数据库,然后从数据库读出来时htmlspecialchars_decode()转为HTML标签。

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

函数原型:htmlspecialchars(string,quotestyle,character-set)

预定义的字符是:

& (和号)    成为 &” (双引号)  成为 "‘ (单引号)  成为 ' (大于)    成为 >

htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符(和htmlspecialchars相反)。

函数原型:htmlspecialchars_decode(string,quotestyle)

二、防止xss攻击

什么是xss攻击?
和上边的sql注入不同的是,xss攻击是合法的字符串,如经过htmlspecialchars()方法实体化后,可以保存在数据库中,但是,当访问含有该字符串的内容页面时,就会出现问题,如字符串里边还有JavaScript,frame代码,原来的页面就会被篡改。

比如你写个留言本,有人去留言写,这个被显出来容易挂病毒都很容易,和数据库无关。

XSS概念
XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie信息、破坏页面结构、重定向到其它网站等。
理论上,只要存在能提供输入的表单并且没做安全过滤或过滤不彻底,都有可能存在XSS漏洞。
下面是一些最简单并且比较常见的恶意字符XSS输入:

1.XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框:alert("XSS");

2.XSS 输入也可能是 HTML 代码段,譬如:
(1).网页不停地刷新
(2).嵌入其它网站的链接 http://xxxx width=250 height=250>

除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的,如下图:

了解到XSS攻击的原理和危害后,其实要预防也不难,下面提供一个简单的PHP防止XSS攻击的函数:

除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的。

了解到XSS攻击的原理和危害后,其实要预防也不难,下面提供一个简单的PHP防止XSS攻击的函数:

';clean_xss($str); //如果你把这个注释掉,你就知道xss攻击的厉害了echo $str;?>

避免被XSS:
1.给用户开放的编辑器尽量过滤掉危险的代码
如果是html编辑器,一般的做法是保留大部分代码,过滤部分可能存在危险的代码,如script, iframe等等

小结

①、关于sql注入可以使用htmlspecialchars()或addslashes()方法,如果连接mysql,可以用mysql_real_escape_string(),还有在php.ini中配置magic_quotes_gpc开启自动转义的扩展。

PHP环境打开自动转义,PHP.INI中查看
当magic_quotes_gpc=on 时将自动进行转义(默认是on),可在程序中用get_magic_quotes_gpc()检查他的状态
程序为:

if (get_magic_quotes_gpc()==1){     $name=stripcslashes($_POST["name"]);       }else{     $name=$_POST["name"];}

②、关于xss攻击可以写一个去处script,frame等代码的方法:

直接用这个函数editor_safe_replace代替htmlspecialchars,既保证安全又能用大部分html代码

function editor_safe_replace($content){    $tags = array(        "']*?>.*?'is",        "']*?>.*?'is",        "']*?>.*?'is",        "']*?>.*?'is",        "']*?>.*?'is",        "']*?>'is",        "']*?>'is",    );    // 1.先过滤掉含有xss攻击的代码    $content = preg_replace($tags, "", $content);    // 2.入库时,防止sql注入,转为HTML实体保存在数据库     $content = htmlspecialchars($content);     return $content;}

所以,对于PHP的安全而言,一定要对用户提交的数据进行过滤校验处理,即先防止SQL注入,后再进行XSS过滤,这两个都需要两手一起抓,且两手都要硬,否则,你的网站将会存在很大的安全风险。

关键字:php


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部