月度归档:2017年09月

代码在线测试执行

空闲时间乱搞了那么一通,竟然按照心里的想法搞了出来
平常在线测试代码比较繁琐 就写了个测试
一直纠结别人怎么弄的
1、支持大多数语言
2、安全性要有保证
3、带智能语法提示

第一点就不多重复了,语言越多越方便

第二点比较重要,安全是首要考虑的问题,拿最简单的来说,代码执行shell命令就可以了,可以把你的服务器所有东西删除掉。所以这是必需要考虑的。

第三点也是很重要的,作为一个程序员,编写程序的时候代码提示还是很重要的,至少对我来说,智能提示还是很需要的~~。

我比较擅长PHP 所以页面用PHP来写咯,接口也是用PHP来写的
运行的环境,当然我不用在自己的服务器上搞,这是很危险的,开始想了虚拟机但是对性能要求比较
高,还有就是服务器被黑的话在恢复的时间上 会很长。别人介绍了用docker(强力推荐),这个软件
非常的方便。即使删除了我系统相关的东西,也能很快的恢复。
语法提示,这个推荐个编辑器 ace.js 编辑器 吊的不得了 强力推荐!!支持120多种语言
相关的工具就那么多 php docker nginx (后面会用到 端口转发) ace.js
流程: php 渲染模板(可以无视) PHP请求数据,生成对应的 编程语言文件,PHP调用命令执行文件。执行的过程是在 docker 里面
其实流程还是比较简单的,踩坑比较多
以前踩过的坑  执行php代码
ace.js 相关
docker相关操作

SSH命令操作参考

1、查看SSH客户端版本

有的时候需要确认一下SSH客户端及其相应的版本号。使用ssh -V命令可以得到版本号。需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用OpenSSH:

$ ssh -V
OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003

下面的例子表明该系统正在使用SSH2:

$ ssh -V
ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux-gnu

2、连接到远程主机:

命令格式 :
ssh name@remoteserver 或者
ssh remoteserver -l name
说明:以上两种方式都可以远程登录到远程主机,server代表远程主机,name为登录远程主机的用户名。

3、连接到远程主机指定的端口:

命令格式:
ssh name@remoteserver -p 2222 或者
ssh remoteserver -l name -p 2222
说明:p 参数指定端口号,通常在路由里做端口映射时,我们不会把22端口直接映射出去,而是转换成其他端口号,这时就需要使用-p端口号命令格式。

4、通过远程主机1跳到远程主机2:

命令格式:
ssh -t remoteserver1 ssh remoteserver2
说明:当远程主机remoteserver2无法直接到达时,可以使用-t参数,然后由remoteserver1跳转到remoteserver2。在此过程中要先输入remoteserver1的密码,然后再输入remoteserver2的密码,然后就可以操作remoteserver2了。

5、通过SSH运行远程shell命令:

命令格式:
ssh -l name remoteserver ‘command’
说明:连接到远程主机,并执行远程主机的command命令。例如:查看远程主机的内存使用情况。
$ ssh -l root 192.168.1.100 svmon -G

6、修改SSH监听端口:

默认情况下,SSH监听连接端口22,攻击者使用端口扫描软件就可以看到主机是否运行有SSH服务,将SSH端口修改为大于1024的端口是一个明智的选择,因为大多数端口扫描软件(包括nmap)默认情况都不扫描高位端口。打开/etc/ssh/sshd_config文件并查找下面这样的行:
Port 22
去掉该行前面的# 号,然后修改端口号并重新启动SSH服务:
$ /etc/init.d/ssh restart

7、仅允许SSH协议版本2:

有两个SSH协议版本,仅使用SSH协议版本2会更安全,SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。编辑/etc/ssh/sshd_config文件并查找下面这样的行:
# Protocol 2,1
修改为
Protocol 2

8、禁止root用户登录:

通常情况下,不采用直接用root用户登录到远程主机,由于root用户拥有超级权限,这样会带来安全隐患,所以,一般我们用普通用户登录,当需要管理远程主机时,再切换到root用户下。打开/etc/ssh/sshd_config文件并查找下面这样的行:
#PermitRootLogin yes
将#号去掉,然后将yes修改成no,重启ssh服务,这样就可以禁止root用户登录。

将#号去掉,然后将bannertest.txt文件的全路径替换/some/path,然后保存,重启ssh服务。当客户端登录时,就会看到bannertest.txt文件中的提示信息。

9、进行端口映射:

假如公司内网有台web服务器,但是只对内不对外,这样,外网就无法访问,可以用ssh进行端口映射来实现外网访问内网的web服务器。假如web服务器名为webserver,webserver可以用ssh访问到远端主机remoteserver,登录到webserver,然后用下面命令进行映射
命令格式:
ssh -R 3000:localhost:80 remoteserver
执行完成后,在remoteserver机器上,执行netstat -an | grep 3000,查看有没有开通3000端口。并执行以下命令观察是否可以打开webserver上的网页
$ w3m http://127.0.0.1:3000
如果能打开界面,说明映射成功.但是,这只限于本机访问web服务器,即只能remoteserver机器访问webserver。因为3000端口绑定的是remoteserver机器的127.0.0.1端口。可以编辑remoteserver机器上的/etc/ssh/sshd_config文件并添加如下内容:
添加 GatewayPorts yes 内容,把监听端口3000绑定到 0.0.0.0 地址上,这样外部的所有机器都能访问到这个监听端口,然后保存退出。并重启ssh服务。完成后其它机器就可以在浏览器中输入 http://remoteserver:3000来访问webserver了。

10、设置登录时提示信息

首先编辑一个文件,如bannertest.txt,文件内容自行定义。然后打开/etc/ssh/sshd_config文件并查找下面这样的行:
#Banner /some/path

ace.js编辑器怎么用?

ace.js编辑器 支持 120多重语言 并且支持markdown 非常好用的代码编辑器

编辑代码或者显示代码 都推荐去使用
语法高亮超过120多种语言
超过20个主题
自动缩进
减少缩进
一个可选的命令行处理庞大的文件(400万线似乎是极限!)
完全自定义的键绑定,包括vim和Emacs模式
用正则表达式的搜索和替换
突出显示匹配的括号
软标签和实际标签之间切换
显示隐藏字符
使用鼠标拖放文本
换行
代码折叠
多个光标和选择
现场语法检查器
剪切,复制和粘贴功能
代码提示
尤其多代码提示功能,做的非常好
使用例子
只需要加载 这两个文件即可 下载的时候 会有src-noconflict 这个文件
<pre id=”editor”><?php 11;?></pre>
<script src=”ace/src-noconflict/ace.js” type=”text/javascript” charset=”utf-8″></script>
<script src=”ace/src-noconflict/ext-language_tools.js” type=”text/javascript” charset=”utf-8″></script>
下面的JS代码要写到 你的编辑器 上面,不然有可能因为加载问题没有代码提示
<script>
var editor = ace.edit(“editor”);//
editor.setTheme(“ace/theme/twilight”);//设置模板
editor.session.setMode(“ace/mode/php”);//设置语言
editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true
});
</script>
ace.js 方法属性调用
editor.getValue();   获取编辑器的值
editor.setValue(value);设置编辑器的值
editor.setTheme("ace/theme/twilight");设置皮肤
//设置编辑配置信息
editor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true,
    enableLiveAutocompletion: true//是否开启智能提示
});
editor.session.setMode("ace/mode/markdown");//设置编辑器语言

PHP如何直接运行PHP代码?

PHP运行PHP代码

一、  eval  函数

此函数运行PHP代码变量

函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false

$symbol = “+”;

$a = 1;

$b = 2;

$c = $a.$symbol.$b;

echo $c.”\n”;

eval(“echo $c;);

此处  直接输出 $c  则是字符串 1+2

eval 方式输出  结果则是  3   相当于 执行了  echo  $a + $b;

注:此函数 官方不建议用,有安全问题

二、流协议加载  

自定义一个流协议  include require 加载协议

function getCode()
{
    return <?php echo www.bubaiso.com’?>’;
}

//自定义协议
class VariableStream
{
    private $string;
    private $position;

    public function stream_open()
    {
        //getCode 接收到参数

        $this->string = getCode();
        $this->position = 0;
        return true;
    }

    public function stream_read($count)
    {
        $ret = substr($this->string, $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }

    public function stream_eof()
    {
    }

    public function stream_stat()
    {
    }
}
//注册流协议
stream_wrapper_register(“myStr”, “VariableStream”);

include(“var://);

返回值无法接收

三、 PHP代码 写入文件, 然后用PHP函数调用系统命令

函数  exec  这个函数带返回值

$str = <?php echo www.bubaiso.com’;?>”;
$fileName = run.php’;

//创建文件
$myfile = fopen($fileName, “w”) or die(“Unable to open file!”);

//写入数据
fwrite($myfile, $str);

//关闭
fclose($myfile);

exec(“php $fileName”,$out,$status);
//需要删除的话  这里是执行之后删除文件操作
unlink($fileName);

//$out 如果参数里面有 \n 回车符  返回值是个数组  可以拼接返回数据
$value = ”;
foreach ($out as $v){
    $value .= $v.”\n”;
}

echo $value;