首页 开发编程 正文

php 空格怎么表示

会使用前端Node.js,黑客能够利用一段很短的代码来实现攻击的可能性越来越小了。仅仅只是敲几个字符作为启动命令执行代码段,无需系统密码就可以添加新的sudo用户、获取权限,就会显示让你创建一个新用户账户的界面。...

php 空格怎么表示,自学前端需要达到什么水平才能去工作?

我是做后端学PHP的,已经干了差不多两年了,没办法前段多多少少接触,不会只有查。我PHP学了差不多6~7个月,我寝室也有3~4个学前端H5的,对于他们学的课程也有所了解。

前端基本要会HTML基本的标记语言以及H5,CSS样式以及出新CSS3要熟悉,前端框架要会PHP也要会Bootstrsp3以及主要用法,JS端要会jqueey前端后端都会用到,ajax也要会用,会使用前端Node.js,手机端web等。到后期也要做几个项目才行,要想学的差不多我估摸没有3~4个月搞不完。

如果自学多看看视频和文档,如果自制能力差一点可以报个网上课程试一试,因为线上有其他同学跟你一起不会还可以问,主要是市场比较新的技术机构肯定比咱了解多。

我有一些线上课程需要@我,互相帮助,共同进步,点个赞。

黑客攻击用的最短代码是什么?

黑客能够利用一段很短的代码来实现攻击的可能性越来越小了。

0和1编造的现代智能社会,通过简单的几个字符就能实现攻击的概率越来越小了。经过这么多年的发展,这么弱的漏洞只要出现100个,很快就会以打补丁的形式灭掉99个,剩下的1个被黑客用来卖钱。

前提条件是没有留后门,这就好比你提前设置一个“空格”或者简单的字符如“#”来作为登录密码,然后自己再来秀一把肌肉,一秒pj。

当然提前做好的代码段,仅仅只是敲几个字符作为启动命令执行代码段,也不算。同理通过控制大量的“肉鸡”来进行类似DDOS这样的功能,也不算。

而应该是拼图游戏中缺失的那一块,恰巧你补上去了,形成了多米诺骨牌那样的连锁反应,最终在极短的时间内达到攻击、侵入的效果。

比如SQL注入

SQL注入属于一种非常常见的网络攻击方式,它并不需要取得操作系统的权限,也不需要利用操作系统的Bug,而只是针对数据库漏洞或者程序员编写代码时疏忽,导致通过一些SQL的语句,就可以无账号登录查看数据,甚至篡改数据库。

通过搭建DVWA渗透测试平台来作为简单的攻击测试,在一个安全级别为Low的网站,仅需要输入一个数字“1”,然后“submit”,然后查看源代码就出出现意想不到的信息。

通过推理后输入“1' union select user,password from users#”后,再点击“submit”就可以获取到重量级的用户名和密码,再由md5进行解密就得到了明文密码。当然感兴趣的小伙伴们可以试着搭建DVWA测试一下。

比如系统漏洞攻击

Ubuntu曾被曝出一个非常严重的漏洞,只需要切换系统语言+输入几行命令,无需系统密码就可以添加新的sudo用户、获取权限,事后还能删除不留痕迹。

在标准用户上打开终端,输入命令“ln -s /dev/zero .pam_environment ”在主目录上创建一个软链接,再在系统设置中打开“区域和语音”,尝试进行更改语言。这时这个对话框就会冻结,一个名为“accounts-daemon”的程序会消耗100%的CPU资源,这时再在终端上输入“rm .pam_environment”删除软链接。此时还需要通过“pidof accounts-daemon”来查找PID,通过kill命令来杀死这个PID。

设置一个计时器用来在注销后重置accounts-daemon,注销后等待几秒钟后,就会显示让你创建一个新用户账户的界面,这个新账户拥有root权限,当然可以运行sudo命令。

黑客攻击并不会局限于某一个系统,比如2020年谷歌安全团队曾指出有一个神秘组织至少部署了11个0day来攻击安卓、IOS和Windows用户。

这些神奇的短代码都具有共同的特性

执行这些代码可能会造成软件或系统的缓存区溢出,这样就会导致程序或者系统出错,还可能会执行侵入者提供的代码。这时就会变成水不是受害者的,桶也不是受害者的,而属于攻击者。比如Windows 2000 SP4简体中文版中通过DIR命令就可以产生“目录溢出”。

执行这些代码也可能是写程序的人故意留下或者欠思考没有形成程序闭环,直到某一天突然被一个人偶然输入一个字符或者一段代码就显形了,也可能是被某些很多系统和程序的大神揪出来,也可能是被黑客通过编写的漏洞扫描工具扫出来。

在一团乱码的程序代码中不可避免地会产生漏洞,这也就是为什么每年都会爆出那么多的高危0day漏洞。但键盘敲几个字符或者鼠标点击下出现的漏洞几乎绝迹了,因为程序员这个职业也在不断进化,不再是程序发展早期的那些学艺不精小白了。

以上个人浅见,欢迎批评指正。

认同我的看法,请点个赞再走,感谢!

喜欢我的,请关注我,再次感谢!

Python有哪些欠吐槽的地方?

Neal Krawetz有一群 geek 朋友,经常一起讨论技术话题,有时候也会谈到编程语言。「I hate Python」,作者表示。他对 Python 厌恶至极。即使有现成的 Python 代码可用,他也宁愿用 C 语言重写。为了系统地吐槽 Python,作者专门写了这篇博客,细数 Python 的「八宗罪」。

这个话题已经在 Hacker News 上引发了热烈的讨论(评论 400+),感兴趣的读者可以去围观或参与一下。

Hacker News 讨论:https://news.ycombinator.com/item?id=18706174

1. 版本

如果要安装一个默认的 Linux 操作系统,那你很有可能需要安装多个版本的 Python:Python2、Python3 甚至是 3.5、3.7。原因在于:Python3 无法与 Python2 完全兼容。甚至一些用小数表示的版本(如 3.5、3.7)也明显缺乏向后的兼容性。

我完全赞成往编程语言中添加新的功能,我甚至不介意淘汰一些旧的版本。但 Python 却要分开安装。我的 Python 3.5 代码不适用于 Python 3.7 安装版本,除非我特意将其导入 3.7。很多 Linux 开发者都觉得导出太麻烦,因此安装 Ubuntu 的时候会一并安装 Python2 和 Python3——因为有的核心功能需要前者,而有的需要后者。

向后兼容性的缺乏和各自为政的版本通常会为其敲响丧钟。Commodore 创造了第一批家用电脑(比 IBM PC 和苹果都要早很多)。但 Commodore PET 不能与后续的 Commodore CBM 兼容。CBM 又不与 VIC-20、Commodore-64、Amiga 等兼容。因此,你要么选择花很多时间将代码从一个平台导到另一个,要么选择放弃这个平台。(Commodore 今天何在?早被用户抛弃凉凉了……)

类似地,Perl 也火过一阵。但 Perl3 与 Perl2 的很多代码也不兼容。社区骂声一片,于是一些好的代码导了出来,其他的则被抛弃了。Perl4 也是如此。等 Perl5 出来的时候,人们干脆改用另一种更稳定的编程语言。如今,只有一小部分人还在频繁使用 Perl 来维持之前的项目。但已经没有人用 Perl 创建新的大项目了。

同理,Python 的每个版本也都存在谷仓效应。之前的版本还要留着,最终造成手里有一堆旧的无用 Python 代码,因为大家都不想花时间将其移到最新版上。据我所知,没有人为 Python2 创建新代码了,但我们还留着它,因为没有人想将所需代码移到 Python3.x 中。Python 2.7、3.5、3.6、3.7 的文档都还在 Python 官网上积极维护着,因为他们无法下决心弃用之前的代码。Python 就像一种僵尸编程语言——已经死掉的部分还在以行尸走肉的方式存在着。

2. 安装

很多软件包都可以帮你轻松地运行 apt、yum、rpm 或其他一些安装库,并获得最新版本的代码。但 Python 并非如此。如果用「apt-get install python」安装,你都不知道自己安的是哪个版本,它可能也无法与你所需的所有代码兼容。

因此,你要安装你需要的那版 Python。我的其中一个项目用到 Python,但必须用 Python3.5。所以最后,我的电脑安装了 Python2、Python2.6、Python3 及 Python3.5。其中两个来自操作系统,一个用于项目,另外一个服务于出于其他原因安装的无关软件。虽然都是 Python,但此 Python 非彼 Python。

如果你想安装 Python 包,你应该使用「pip」(Pip Installs Packages)。但由于系统上有一堆 Python,你要注意使用正确版本的 pip。否则,「pip」可能运行「pip2」,而不是你需要的「pip3.7」。(如果名称不存在,你需要为 pip3.7 指定明确的真实路径)

一位队友建议我配置自己的环境,这样的话每种软件都可以使用 Python3.5 的 base 环境。在我需要用 Python3.6 开展另一个项目之前,这种做法是非常行得通的,但是需要 Python 3.6 就得创建另外一个环境。两个项目,两版 Python,一点都不会混,真的(用生命在假笑)。

pip 安装程序将文件放置在用户的本地目录。安装系统级的库时不用 pip。Gawd 不允许你在运行「sudo pip」时出错,因为那会毁了你的整个电脑!运行 sudo 可能会使一些软件包在系统级别安装,有些是为错误版本的 Python 安装的,而你的主目录中的一些文件可能最终归 root 所有,因此未来的非 sudo pip 安装可能会因权限问题而失败。不要这样做。

这些 pip 模块由谁来维护呢?当然是社区。也就是说,没有明确的所有者,也没有强制性的来源链或责任链。今年早些时候,PyPI 的一个版本中发现了一个窃取 SSH 凭证的后门。这也是意料之中。(出于同样的原因,我不用 Node.js 和 npm;我不信任他们的社区项目。)

3. 句法

我非常主张代码的可读性要强。乍一看,Python 的可读性似乎不错。但当你开始创建大型代码库的时候你就不会这么想了。

大多数编程语言使用某种符号来标识范围——函数的开始和结束位置、条件语句中包含的操作、变量的定义范围等。C 语言、Java、JavaScript、Perl 和 PHP 都用 {...} 来定义范围,Lisp 使用 (...)。Python 呢?它用空格!如果你要定义复杂代码的范围,你可以缩进接下来的几行代码,缩进结束时,该范围也截止。

Python 手册说,你可以用任意数量的空格或制表符来定义范围。但是,每次缩进最好使用四个空格!如果你想缩进两次进行嵌套,使用八个空格!Python 社区已经对此进行标准化,即使 Python 手册中并没有明文规定。这个社区就喜欢用四个空格。所以,除非你不打算将自己的代码向任何人展示,否则的话每次缩进最好用四个空格。

我第一次看到 Python 代码时,觉得用缩进来定义范围还挺好的,但这么做有一个巨大的缺陷。你可以进行深度嵌套,但这么做使得每一行都会很长,导致不得不在文本编辑器中换行。较长的函数和条件语句可能会使开始和结束范围很难匹配。而且当你不小心把三个空格当成四个空格,还容易出现计算错误,进而花几个小时来调试和追踪。

对于其它语言,我已经养成了调试代码不带任何缩进的习惯。这样,我可以快速浏览代码,然后轻松地识别和删除调试代码。但 Python 呢?任何没有适当缩进的代码都会产生缩进错误。

4. includes

大部分编程语言都有办法导入其它代码块。比如,C 语言用「#include」,PHP 语言可以用「include、include_once、require、require」。而 Python 用的是「import」。

Python 可以导入整个模块、模块的一部分或模块中的特定函数。C 语言?你可以查看「/usr/include/」。Python 的话,最好用「python -v」列出所有路径,然后从列表中搜索每个目录和子目录中的每个文件。我有些朋友很喜欢 Python,但我看到他们想导入东西时,总得浏览标准模块。

导入功能还允许用户重命名导入的代码。它们基本上定义了一个自定义的命名空间。乍一看,你会觉得挺不错的,但这最终会影响可读性和长期支持。重命名对于较小的脚本来说还是不错的,但对于长期项目来说真的不适用。那些使用 1-2 个字母作为命名空间(比如「import numpy as n」),而且还不按约定俗成的方式来命名的,简直应该拉出去枪毙!

这还不是最糟糕的。大部分编程语言 include 代码的时候就只是导入代码而已。如果有一个带有构造函数的全局对象,有些语言,如面向对象的 C++可能会执行代码。类似地,有些 PHP 代码可能会定义全局变量,所以导入可以运行代码——但这种做法通常被认为很糟糕。相比之下,很多 Python 模块包含在导入期间运行的初始化函数。你不知道在运行的是什么,它要干什么,你甚至可能不会注意到。除非存在命名空间冲突,如果这样就好玩了,你得花很多时间来寻找原因。

5. 命名法

在其它语言中,数组(array)直接称之为'arrays',但是在 Python 中,它们被称为 'lists'。关联数组在某些地方被称为 'hash' (Perl),但是 Python 将其称为「字典」(dictionary)。Python 似乎完全按照自己的节奏来,不使用计算机科学和信息科学领域的常见术语。

此外,Python 库的命名也有问题。PyPy、PyPi、NumPy、SciPy、SymPy、PyGtk、Pyglet、PyGame……(前两个库的发音一样,但是它们的功能完全不同)。我理解「py」表示 Python,但是它们就不能统一出现在前面或后面吗?

一些常见库放弃了类似双关语的「Py」命名约定,包括 matplotlib、nose、Pillow和 SQLAlchemy。虽然有一些命名可能暗示其目的(如 SQLAlchemy 包含 SQL,所以它可能是一个 SQL 接口),但是其它的可能只是随机的单词。如果你不知道「BeautifulSoup」这个库是干什么的,那么你能从命名看出来它是一个 HTML/XML 解析器吗?不过,BeautifulSoup 有很完善的文档且易于使用,如果每一个 Python 模块都这样,我也就不抱怨了,但是大多数 Python 库的文档非常烂。

总的来说,我认为 Python 是一个具有不一致命名约定的函数库集合。我经常抱怨开源项目的命名非常可怕。除非你知道这些项目在干什么,否则你从命名本身中什么都看不出来。除非你知道在寻找什么样的库,不然只能通过别人偶然提及的名字或偶然的机会发现一些库。大多数 Python 库加重了这种现象,也加重了 Python 的负面体验。

6. 奇怪的操作

每种语言都有自己比较奇特的操作。C 语言中使用 & 和 * 获取地址空间和值的命名法非常奇怪。C 语言中还有用 ++ 和—实现 increment/decrement 的捷径。Bash 语言中,在引用特定字符(如用于正则表达式的圆括号和句号)时需要一直考虑「什么时候使用转义符 (\)」。JavaScript 兼容性有问题(并非每个浏览器都支持所有有用的功能)。但 Python 的奇怪操作比我见过的其他语言都多。如:

在 C 语言中,双引号里的是字符串,单引号里的是字符。

在 PHP 和 Bash 中,两种引号都能包含字符串。但是,双引号里的字符串可以嵌入变量。相比之下,单引号的字符串是文字;任何嵌入的类似变量的名称都不可扩展。

在 JavaScript 中,单引号和双引号没什么区别。

在 Python 中,单引号和双引号也没有什么区别。但是,如果你想让字符串跨行,就得用三重引号,如"""string""" 或 '''string'''。如果你想用二进制,那你需要优先选择带有 b(b'binary')或 r(r'raw')的字符串。有时你要用 str(string) 把字符串转换为字符串,或使用 string.encode('utf-8') 将其转换为 utf8 格式。

如果你一开始认为 PHP 和 JavaScript 中的=、==、===有点奇怪,那等你用 Python 中的引号时可能不会这么想了。

7. 通过对象 Reference 传递

大多数编程语言的函数参数传递是传值。如果函数改变了值,结果不会传递回调用代码。但正如我解释过的,Python 偏偏要有所不同。Python 默认使用 pass-by-object-reference 来传递函数参数。这意味着改变源变量可能最终会改变值。

这是面向程序、函数和对象的编程语言之间的最大区别。如果每个变量都由对象引用来传递,并且变量的任何变化都会改变所有的引用,那你可能使用的都是全局对象。通过不同的命名调用相同的对象不会改变对象,所以实际上它就是全局的。此外,正如 C 的程序员早就学到的,全局变量太恶心了,别用。

在 Python 中,你必须通过值来传递变量,例如「a=b」只是给相同的对象空间分配了另一个命名,但并没有复制 b 的值给 a。如果你真的想要复制 b 的值,你需要使用一个 copy 函数,通常是「a=b.copy()"的形式。然而,注意我说的是「通常」。不是所有数据类型都有一个「copy」原型,或者 copy 函数可能是不完整的。在这种情况下,你可以使用单独的「copy」库:"a=copy.deepcopy(b)"。

8. 本地命名

用所用的库或函数的名字来命名程序是常见的编程技巧。例如,如果我用一个叫做「libscreencapture.so」的 C 库来测试一个截屏程序,我会将该程序命名为「screencapture.c」并编译为「screencapture.exe」。

gcc -o screencapture.exe screencapture.c -lscreencapture

在 C、Java、JavaScript、Perl、PHP 等语言中,这通常很有效,因为这些语言可以轻易地辨别本地程序和资源库,它们有不同的路径。但 Python 呢?还是算了吧,千万别这样做。为什么?Python 会假定你首先要导入本地代码。如果我有一个名为「screencapture.py」的程序使用了「import screencapture」,那么它将导入自己而不是系统库。至少,你应该调用本地程序「myscreencapture.py」吧。

并非一无是处

Python 是一门非常流行的编程语言,有很多粉丝。甚至我的很多朋友都很喜欢 Python。多年来,我和他们讨论过这些问题,每次他们都点头表示同意。他们并不反对 Python 存在这些问题,只是认为这不足以浇灭他们对这种语言的热情。

我的朋友经常提到那些非常酷的 Python 库。我同意一些库非常有用。例如,BeautifulSoup 是我用过最好的 HTML 解析器之一,NumPy 使多维数组和复杂的数学更容易实现,而 TensorFlow 对于机器学习非常有用。但是,我不会因为喜欢 TensorFlow 或 SciPy 而用 Python 创建单片程序。我不打算为了这些「蝇头小利」而放弃可读性和可维护性,这不值得。

通常当我写一篇关于某个主题的批评时,我也会尝试写一些积极的东西。但我没办法列出关于 Python 的好的方面,因为我真的认为 Python 很糟糕。

如何才能写出高质量的代码?

作为一名java开发工程师,对于这个问题我算是比较有感触的,所以想说说我对java开发的一些看法,纯属个人意见,不喜轻喷!

什么样的代码算是高质量代码,或者说是高质量代码的特征?

在我看来,主要就是在于可读性、易扩展两方面。

首先,我觉得最重要是要可读性高。为什么这么说呢?相信做过开发的朋友都知道,互联网公司的人员流动率还是比较高的,可能出现的情况是领导突然跟你说,你去交接一下某某某同事的工作,而交接的时候一般情况主要是业务流程、功能模块来交接,大概率不会一行一行的代码去读。如果项目正常运转,不出问题、也没有需求变更(大概率需求会变更),那就是你好我好大家好,如果出了问题或者需求变更,还是之前同事的那些模块,那就必须得去啃代码了。这个时候代码的易读性就显得非常重要了。你可以试想一下,通篇没有一句注释、一个方法几百行、if/else满天飞、方法之间参数传递全是map、sql语句各种嵌套子查询、关联查询7-8个表,当你看到这样的代码,估计心里顿时万马奔腾,怒火蹭蹭蹭的往头上涌去。所以我觉得可读性是第一要素。

其次,扩展性要好。这个也很好理解,现在是信息时代,流量为王,为了提高市场占有率,普遍需求变更频繁,2周一次发布都是正常频率。在这种频繁需求变更的情况下,如果代码的扩展性不高,每一次需求都需要大量改动代码,即耗费时间还容易出错,比如漏改某处地方而引起其他功能异常。所以开发过程中要注意代码扩展性,当然也不要去过分设计,让代码晦涩难懂。

高质量代码在开发中的意义?《计算机程序的构造和解释》一书提到代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已。如果代码是写给机器看的,那完全可以使用汇编语言或者机器语言(二进制),直接让机器执行。

所以代码一定要让人容易理解。高质量代码的好处:

好的代码读起来令人赏心悦目,比如java里的spring、mybatis等框架,读源码时常常不自觉发出惊叹,代码原来还可以这么写!

质量高意味着维护成本低,运行稳定

质量高意味着扩展性强,方便业务开发

如何去写高质量代码?

对于做java的来说,我建议去看一下《阿里巴巴Java开发手册》。

手册以 Java 开发者为中心视角,划分为编程规约、异常日志、单元测试、安全规约、MySQL 数据库、工程结构、设计规约七个维度,再根据内容特征,细分成若干二级子目录。根据约束力强弱及故障敏感性,规约依次分为强制、推荐、参考三大类。对于规约条目的延伸信息中,“说明”对规约做了适当扩展和解释;“正例”提倡什么样的编码和实现方式;“反例”说明需要提防的雷区,以及真实的错误案例。 摘自《阿里巴巴 Java 开发手册》

最后推荐一下阿里巴巴代码规范扫描插件,以IDEA为例,安装如下

使用如下:

Markdown是否是一个程序员必会的文档编辑技能?

虽说很少有哪家公司,在招聘的时候,强制要求程序员会 Markdown 编辑文档,但是,Markdown 几乎是程序员在书写文档时,绕不开的技能。

使用频率高

在项目中交付时,少不了说明文档

Readme.md

,或者指导手册 wiki,这些文档几乎都支持 Markdown 书写。如果同事需要接手你的项目,要是你丢一个 txt 文件,那一大推文字简直要个程序员老命。或者丢来 word 文档,我还得想想 office 安装好了没,毕竟作为一个程序员,已经好久没打开过 word 了。

如果你经常出入程序员聚集场所,就会发现,几乎自带的编辑器都支持 Markdown 语法。CSDN、博客园、简书等平台都支持 Markdown,要是有一条头条能支持 Markdown ,码字就更舒服了。

书写过程流畅

和大多数富文本编辑器不一样,Markdown 并不是所写即所得,需要一个渲染的过程。有点像写代码的过程,敲完了还得想一下,最终展现的效果是什么样的。不过现在很多软件都支持预览,可以看到最终呈现的效果。

但是,也带来了一大好处,书写是连贯的。编写文字和调整样式一气呵成,不用再去找加粗、斜体、插入链接等操作按钮。视线始终在书写的位置,双手也根本不需要操作鼠标。

如果想要提高码字(代码)效率,就要做到:能用键盘搞定的,绝对不要使用鼠标。

较少的语法与良好地兼容

Markdown 语法2004年就已经出现,这么多年了,本身并没有扩充新的语法。因此,只需要掌握不到20个语法,就能满足绝大多数编写场景。无论在 Mac ,还是 Win 操作系统,无论使用何种 Markdown 编辑器,使用基本Markdown 语法渲染的内容,都能正确地呈献给读者。

如果手边暂时没有顺手的 Markdown 编辑器,可以使用 IDE 插件的方式,轻松阅读和编辑 Markdown 文件。

出书

Markdown 能被使用来撰写电子书,使用开源的 Gitbook 能快速地生成电子书。如果将自己散落的 Markdown 文件组织起来,编辑出书,也是对自己莫大的鼓励。我曾经对 Gitbook 有长时间的研究,有兴趣的话可以一起交流。

本文转载自互联网,如有侵权,联系删除