您的位置:首页 > 运维架构 > 网站架构

mvc,以及各种php网站攻击

2012-09-22 18:34 211 查看
cookie的HttpOnly属性妙用:
+--------------------------------------------------------------+
为了解决XSS(跨脚本攻击的问题),IE6开始支持cookie的HTTPOnly属性,这个属性是目前被大多数浏览器支持!

当cookie中的HttpOnly属性设置为true,前端脚本就无法访问或操作cookie了(只能适合后台访问),这样XSS就无效了.

在PHP里面,cookie的HttpOnly有两种设置方式.

方法一:
header("Set-Cookie:tmp=100;HttpOnly");

方法二:
setcookie("tmp",100,NULL,NULL,NULL,NULL,TRUE);
+--------------------------------------------------------------+

1.SQL注入:
SQL注入是一种恶意攻击,用户利用在表单中输入SQL语句来影响正常的SQL执行,还有一种是通过system()或是exec()命令注入的,它具有的相同的SQL注入机制,但只针对shell命令.

$username=$_POST['username'];
$query="select * from auth where username='".$username."'";
echo $query;
$db=new mysqli('localhost','demo',`demo`,`demodemo`);
$result=$db->query($query);
if($result && $result->num_rows){
echo "<br>Logged in successfuly</br>";

}else{
echo "<br/>Login failed";
}
上面的代码,在这一行没有过滤或转义用户输入的值$_POST['username'].因此查询可能会丢失失败,甚至会损坏数据库,这要看$username是否包含你的SQL语句到别的语句上面

防止SQL注入:
选项:
1.使用mysql_real_escape_string()过滤数据
2.手动检查每一数据是否为正确的数据类型
3.使用预处理语句并绑定变量
使用准备好的预处理语句:
1.分离数据和sql逻辑
2.预处理语句将自动过滤(如:转义)
3.把它作为一个编码规范,可以帮助团队里的新人避免遇到以上的问题.

$query='select name,district from city where countrycode=?';
if($stmt=$db->prepare($query)){
$countrycode='hk';
$stmt->bind_param("s",$countrycode);
$stmt->execute();
$stmt->bind_result($name,$district);
while($stmt ($stmt->fetch())){
echo $name.','.$district;
echo "<br/>";
}
$stmt->close();
}

2.XSS攻击
跨站点脚本攻击是一种攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常为js).如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行.

接收用户提交的文本内容:
<?php
if(file_exists('comments')){
$comments=get_saved_contents_from_file('comments');
}else{
$comments='';
}

if(isset($_POST['comment'])){
$comments.='<br/>'.$_POST['comment'];
save_contents_to_file('comments',$comments);
}
?>
输出内容给(另一个)用户:
<form action="xss.php" method="POST">
Enter your comments here:<br/>
<textarea name='comment'></textarea><br/>
<input type="submit" value="Post comment"/>
</form><hr/><br/>
<?php
echo $comments;?>

将会发生什么事?
1.烦人的广告
2.刷新或者是重定向
3.损坏网页或表单
4.窃取cookie
5.AJAX(XMLHttpRequest)

防止XSS攻击:
为了防止XSS攻击,使用PHP的Htmlentities()函数过滤再输出到浏览器.htmlentities()基本用法很简单,单有很多高级的控制,XSS速查表!

3.会话固定:
会话安全,假设一个PHPSESSID很难猜测.然而,PHP可以接受一个会话ID通过一个COOKIE或者URL.因此欺骗一个受害者可以使用一个特定的(或其他的)会话ID或者钓鱼攻击.

4.会议捕获和劫持
这是与会话固有着同样的想法,然而他会涉及会话id.如果会话ID存储在Cookie中,攻击者可以通过xss和javascript窃取.如果会话ID包含在URL上,也可以嗅探或者从代理服务器那获得.

5.跨站点请求伪造(CSRF)
CSRF攻击是指从一个页面发出的请求,看起来像是网站的信任用户,但不是故意的.他有许多的变体,比如下面的例子:
<img src='http://example.com/single_click_to_buy.php?userid_id=123&item=123456'>

6.防止跨站点请求伪造
一般来说,确保用户来自你的表单,并且匹配每一个你发出去的表单,有一点一定注意:
a.对用户采取适当的安全措施,例如:给每一个绘画更新id和用户使用SSL
b.生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交的时候检查它.

7.代码注入:
代码注入是利用计算机通过处理无效数据造成的.问题在于.你不小心执行任意代码,通常包含文件包含.写的很糟糕的代码可以允许一个远程文件包含并执行,比如许多php函数,如require可以包含URL或文件名,例如:
<form>Choose theme:
<select name =theme>
<option value=blue >Blue </option>
<option value=green >Green </option>
<option value=red >Red </option>
</select>
<input type="submit">
</form>
<?php
if($theme){
require($theme.'.txt');
}
?>

防止代码注入:
1.过滤用户输入
2.在php.ini设置禁用allow_url_fopen和allow_url_include.这将禁用require/include/fopen的远程文件

其他的一些原则:
1. 不要依赖服务器配置来保护你的应用,特别是当你的web服务器/ PHP是由你的ISP管理,或者当你的网站可能迁移/部署到别处,未来再从别处迁移/部署在到其他地方。请在网站代码中嵌入带有安全意识的检查/逻辑 (HTML、JavaScript、PHP,等等)。  
2. 设计服务器端的安全脚本:
—例如,使用单行执行 - 单点身份验证和数据清理  
—例如,在所有的安全敏感页面嵌入一个PHP函数/文件,用来处理所有登录/安全性逻辑检查
3. 确保你的代码更新,并打上最新补丁。
+--------------------------------------------------------------+
其实本来不想在继续这个话题,但是今天看到的评论:
1/三层和MVC没啥关系
2/虽然没直接关系,但是还有间接关系

这是举例子,记得以前有一篇说三层的很流行的文章,里面把三层比喻为笼屉,笼屉分为多层的,每一层都可以蒸不同的事物,包子,馒头,饺子,烧卖,笼屉里的事物也可以换,这个就是一个基本思想.

<深入浅出设计模式>里面,把MVC比做是一种夹心饼干,上下两块是饼干,中间是夹心.夹的心把上下两块饼干粘合在了一起.

如果说把饼干放在笼屉里面蒸,有点别扭,所以我就换成了加肉馒.就是上下两块馒头,中间食肉.可以想象汉堡.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: