最近更新
阅读排行
读过本文章的之前读了
关注本站

网站安全之浅析数据安全

阅读:4559 次   编辑日期:2013-11-02

目录:

概述:

我们在编写代码的过程中,会很注意代码的精简与重复利用率,但是如果一个网站牵扯到数据的话,最严重的问题还是数据安全。用户名密码泄露,这是我们最先想到的网站安全的问题,但是这类问题绝大部分是因为用户没有保护好自己的用户名密码,例如:在公共场合使用帐号密码不及时清除,自己使用的电脑中了病毒等等,接下来我们来简单的说一下数据安全。

关于MD5加密:

但是,从网站角度来讲,也要对用户的帐号密码加密,因为也有可能数据库被偷,加密方法很多,小聊一下最常用的MD5加密,也就是PHP的一个函数 md5(string,raw) md5() 函数计算字符串的 MD5 散列。 md5() 函数使用 RSA 数据安全,包括 MD5 报文摘译算法。 如果成功,则返回所计算的 MD5 散列,如果失败,则返回 false。
    <?php
    $str = "uw3c";
    echo md5($str);
    ;?>
    输出:
	dcb3a31141489a9640a6a03e430cf5b1
请注意,MD5这个函数是不可逆的,如果 md5(dcb3a31141489a9640a6a03e430cf5b1) 当然得不到 "uw3c"。 当然现在来讲MD5已经不是很安全,为什么不安全就不说了,省得有些同鞋起了好奇心,也避免被别人利用。 顺便还是提醒大家,密码要设置成 不规律的 混有 大小写字母 + 数字 的长位(最好在10位以上)最安全,例如 uW3c2013MD5. 最后说一句这样的密码(uW3c2013MD5),只要是你自己特有的,只要稍微复杂,只要你不在其他任何不安全的地方输入,不与其他任何帐号密码重复,就会很安全。 MD5的问题之后我们会详细来讲。

XSS注入:

说完MD5,我们来说一下关于程序员在编写代码中应该注意的地方。
先说一个漏洞,现在很多网站在做活动时,都会玩翻纸牌的游戏,规则如下:翻到两张一样的就消除,看谁能在最快的时间里面把所有纸牌消除,前X名有奖品。但是,很多网站的做法是在页面加载完成之后,这些纸牌的数据就已经赋值给纸牌了,所以只要查看源代码,就可以知道每张扣着的纸牌是什么牌,自己计算之后点击开始按钮,就可以很快的玩完游戏。这样是不是很屌丝?解决方法也很简单,当用户点击开始按钮之后在通过AJAX给纸牌赋值,这样虽然也可以通过源码查看,但是时间已经流失了~
接下来说一下XSS注入: 在很多网站都会有 留言框 或者发布框,在这写地方都是需要做过滤的,尤其是"<",">" 这样的符号,为什么要这样做呢? 举个例子: 我在HTML中插入这样一行代码:
    <script>
        alert("uw3c.com");
    </script>
那么这个页面会有个提示框 alert("uw3c.com"),这个大家都知道。 那么如果我在新浪微博发布一条状态:<script>alert("uw3c.com")</script>会有提示框alert吗?当然不会,如果这样的话,我的所有好友在看到这条状态的时候,他们的页面都会有个提示框alert,这岂不是很恶心!那么为什么没有提示框alert出现呢?因为像"<"、">"这些字符已经被转义了,那么是如何转义的呢?
方案1:使用JavaScript进行转义
如果用JS来进行转义,那么就要用到正则表达式 对"\""、"&"、"'"、"<"、">"、空格(0x20)、0x00到0x20、0x7F-0xFF 以及0x0100-0x2700的字符进行转义,基本上就覆盖的比较全面了。 用javascript的正则表达式可以写为:
 /"|&|'|<|>|[\x00-\x20]|[\x7F-\xFF]|[\u0100-\u2700]/g;
转义的代码非常简单,这个方法是把这些标签转换成“实体编号”。当然也可以用别的办法转换成“实体名称”,但是实体名称并不能保证所有浏览器都能识别,代码如下:
 var uw3ceCode = /"|&|'|<|>|[\x00-\x20]|[\x7F-\xFF]|[\u0100-\u2700]/g;
		function encodeHtml(s){
		  return (typeof s != "string") ? s :
			 s.replace(uw3ceCode,
					   function($0){
						   var c = $0.charCodeAt(0), r = ["&#"];
						  c = (c == 0x20) ? 0xA0 : c;
						   r.push(c); r.push(";");
							return r.join("");
						});
		}
	encodeHtml("uw3c")
方案2:使用php内置函数进行转义
PHP htmlentities() 函数,例如:
<?php
    $str = "uw3c";
    echo htmlentities($str, ENT_COMPAT);
?>

SQL注入(MYSQL),代码如下:

<?php
    $user = $_POST['user']
	$password = $_POST['pwd']
	$sql = mysql_query("SELECT * FROM users WHERE user='$user'
    AND password='$password'");
?>
那么如果用户提交的表单内容为:
    $_POST['user'] = 'uw3c';
	$_POST['pwd'] = "' OR ''='";
那么上面那句MYSQL语句就会改为:
    $sql = mysql_query("SELECT * FROM users WHERE user='uw3c'
    AND password='' OR ''=''");
这样的话,用户'uw3c'就可以登录了,因为没有判断密码的正确与否。那么应该如何避免这个问题呢?,这用到了MYSQL的 mysql_real_escape_string()方法,来看下面的代码:
    <?php
    $user = mysql_real_escape_string($_POST['user']);
    $pwd = mysql_real_escape_string($_POST['pwd']);
	$sql = mysql_query("SELECT * FROM users WHERE user='$user'
    AND password='$password'");
    ?>
这样,就会把一些字符(例如 ‘, “等)进行转义,从而起到安全防护的作用。 网站安全是很复杂,很任重道远的事情,以后我们会更加详细的讲解一下。

最后,我们来说一下社会“攻城”学:

为什么会叫社会“攻城”学,因为这跟社交有关系,举个很屌丝的例子:一个男屌丝平时不会告诉别人自己的用户名密码,但是有一天这个男屌丝的女神问他密码,男屌丝说不定就会说了~所以在生活中不要告诉别人自己的账号密码,但是如果你确定这个人就是以后为你保管银行卡的人的话,在“修成正果”之后是可以给的~。
将本篇文章分享到:
top