这几天由于一个安全度较高的项目需要启动 所以我也就把大部分精力放到了编码安全上面。也了解了一些PHP编码方面的安全漏洞。比如XSS攻击和SQL注入等。由于本人资历尚浅,不能尝试编写出攻击类代码,本篇文章只记录本人近几天通过学习PHP安全编码方面的一些知识来防止和降低被攻击的危险。
1.关于XSS攻击
首先我们先看一段PHP代码:
<p class="sycode"> < form action = " <?php echo $_SERVER ['PHP_SELF']; ?> " > < input type = " submit " name = " submit " value = " submit " /> </ form > </p>
目的是提交到当前页面。当我们输入http://localhost/xss/index.php的时候。页面正常的提交了。这就是我们想要的结果。
但是http://localhost/xss/index.php?a=1的时候浏览器也正常提交了。这样可就不是我们想要的了。当我们在浏览器中输入http://localhost/xss/index.php/%3E%22%3E%3Cscript%3Ealert%28%27xss%27%29%3C/script%3E
看看会发生什么事吧。没错浏览器弹出了XSS的提示框。这就表明网站存在被XSS攻击的危险了。
那么我们怎样解决这一问题呢 ,下面请看如下代码:
<p class="sycode"> < form action = " <?php echo htmlspecialchars( $_SERVER ['PHP_SELF']); ?> " > < input type = " submit " name = " submit " value = " submit " /> </ form > </p>
现在再次提交上面的恶意代码,这样我们是不是就避免了被攻击了呢。
htmlspecialchars 函数把一些预定义的字符转换为 HTML 实体。
2.关于SQL注入
下面先看一个例子(这个例子只是起到说明作用,无实际效果):
<p class="sycode"> $name = $_GET [ ' username ' ]; mysql_query (“SELECT * FROM users WHERE name = ’{ $name }’”); </p>
当我们在浏览器输入http://localhost/xss/index.php?username=confusing,的时候,正常进入了SQL的SELECT语句。这是我们想要的结果。
可是当我们在浏览器中输入:http://localhost/xss/index.php?username=confusing';DELETE FROM users;
这条SQL语句就变成了:
<p class="sycode"> SELECT * FROM users WHERE name = ' confusing ' ; DELETE FROM users; </p>
多么可怕的事情。这条语句把users表删除掉了。
那么我们怎样防止这样的事情发生呢?
1).验证输入
看下面的代码片段:
<p class="sycode"> if (get_magic_quotes_gpc()) { </p> <p class="sycode"> $name = stripslashes($name); </p> <p class="sycode"> $name = mysql_real_escape_string ($_GET['username']; ); mysql_query (“SELECT * FROM users WHERE name = ’{ $name }’”); </p>
这样是不是更安全了一些呢。
还有一些比较好的PHP函数库比如我上篇提到的Ctype。都是一些验证很好的验证数据的工具。只要我们不耐其烦的认真检验用户输入的数据就能最大限度的减少被攻击的几率。
今天只写这么多,本人也在学习中。如发现更多会在本处直接更新。