当前位置: 首页 > news >正文

为什么网站经常被攻击简易个人网页模板

为什么网站经常被攻击,简易个人网页模板,网站做推广赚钱项目,宜宾做网站的公司Http协议 1.1 什么是http协议 在进行网络通信时#xff0c;应用层协议一般都是程序员自己写的#xff0c;但是有一些大佬其实已经定义出了一些现成的应用层协议#xff0c;例如#xff1a;HTTP#xff08;超文本传输协议#xff09;、FTP#xff08;文件传输协议#…Http协议 1.1 什么是http协议 在进行网络通信时应用层协议一般都是程序员自己写的但是有一些大佬其实已经定义出了一些现成的应用层协议例如HTTP超文本传输协议、FTP文件传输协议、SMTP简单邮件传输协议、POP3邮局协议版本3、IMAPInternet邮件访问协议、DNS域名系统、SNMP简单网络管理协议、DHCP动态主机配置协议等等 HTTP 协议是客户端与服务器之间通信的基础。它规定了客户端通常是浏览器和服务器之间交换数据尤其是超文本的格式和方式。客户端通过 HTTP 协议向服务器发送请求服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议即每次请求都需要建立新的连接且服务器不会保存客户端的状态信息 1.2 认识Url URLUniform Resource Locator统一资源定位符是互联网上标准资源的地址Address。它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL它包含的信息指出文件的位置以及浏览器应该怎么处理它。 协议指定了应用层应该使用哪种协议来访问资源如http、https、ftp等。主机名指定了服务器的域名或IP地址是资源所在的服务器地址但是ip地址对于用户来说是不合适的这里通常是域名例如 www.baidu.com ,当我们通过域名访问服务器时会自动将域名改为IP地址所以我们可以认为他们是等价的端口号HTTP协议在默认情况下强绑定到TCP的80端口上。这意味着当浏览器或其他HTTP客户端尝试访问一个Web服务器上的资源时如果没有指定端口号它会默认使用80端口来发送请求。服务器在监听80端口时也会期待接收来自这个端口的HTTP请求所以url中一般不会包含80端口号。路径指定了服务器上资源的路径。查询字符串可选部分位于路径之后用 分隔。它允许向服务器传递额外的信息如搜索条件、表单数据等。这些信息通常以键值对的形式出现键值对之间用 连接。片段标识符可选部分位于URL的末尾用 # 分隔。它用于指定资源内部的一个片段如HTML页面中的一个特定部分。浏览器会自动滚动到该片段的位置 1.3 urlencode 和 urldecode 像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 转义的规则如下: 将需要转码的字符转为 16 进制然后从右到左取 4 位(不足 4 位直接处理)每 2 位 做一位前面加上%编码成%XY 格式。 例如我们搜索关键词c此时URL中的字符就被编码为%2b%2b了 1.4 HTTP 协议请求与响应格式 1.4.1 HTTP请求 HTTP请求包括四部分 请求行格式请求方法空格URL空格HTTP版本\r\n请求报头请求头包含了多个字段每个字段都是一个键值对用来描述请求或指定请求的资源、客户端的信息、响应内容应如何接收等。key : 空格value空行用来标记请求报头结束方便反序列化请求正文如果客户端没有像服务器传输数据的话请求正文就是空的 注意 在url中的 / 并不是我们平时见的根目录他的名字叫web根目录,可以是一台机器的任意一个目录所有的网站静态资源都保存在这个目录下当我们访问的url为/时一般会跳转到该网站的首页 根据http请求的格式我们就可以将客户端的请求进行反序列化找到其要访问的资源在构建应答发送给它。 代码实现思路 要注意当我们用浏览器访问我们的机器的资源时就是构建了一个http请求浏览器会将请求进行序列化再将序列化出来的字符串发送给我们所以我们收到的其实是如上如所示的一条字符串而我们的工作就是将这个字符串进行反序列化然后构建应答发送给浏览器 反序列化思路先粗分再细分 首先我们将收到的序列化字符串先分为请求行报头、请求正文报头的话就是多个字符串我们先把他放在一个字符串数组中。再解析请求行详细分为方法、url、版本的等信息报头是key-value的格式我们可以用哈希表来存放 const static std::string base_sep \r\n; const static std::string space_sep ; const static std::string line_sep : ; const static std::string prefixpath wwwroot; // web根目录 const static std::string homepage index.html; const static std::string suffixsep .; const static std::string httpversion HTTP/1.0; const static std::string arg_sep ?;class HttpRequest { private:// 得到一行std::string GetLine(std::string reqstr){auto pos reqstr.find(base_sep);if (pos std::string::npos)return std::string();std::string line reqstr.substr(0, pos);reqstr.erase(0, line.size() base_sep.size());return line.empty() ? base_sep : line; // 如果读取到空白行那截取的就是空串则直接返回空白行就可以}// 解析请求行void ParseReqline(){std::stringstream ss(_req_line);ss _method _url _version;_path _url;// 添加一个首页if (_path[_path.size() - 1] /){_path homepage;}auto pos _url.rfind(suffixsep);if (pos ! std::string::npos){_suffix _path.substr(pos);}else{_suffix .default;}}void ParseReqHeader(){for (auto header : _req_headers){auto pos header.find(line_sep);if (pos std::string::npos)continue;std::string k header.substr(0, pos);std::string v header.substr(pos line_sep.size());if (k.empty() || v.empty())continue;_headers_kv.insert(std::make_pair(k, v));}}public:HttpRequest(): _blank_line(base_sep), _path(prefixpath){}~HttpRequest(){}void DeSerialize(std::string reqstr){// 粗力度反序列_req_line GetLine(reqstr); // 请求行std::string header; // 请求报头do{header GetLine(reqstr);if (header.empty() || header base_sep)break;_req_headers.push_back(header);} while (true);if (!reqstr.empty()) // 请求正文{_body_text reqstr;}ParseReqline();ParseReqHeader();}void Print(){std::cout ---------------------------- std::endl;std::cout ### _req_line std::endl;for (auto header : _req_headers){std::cout header std::endl;}std::cout *** _blank_line;std::cout _body_text std::endl;std::cout Method: _method std::endl;std::cout Url: _url std::endl;std::cout Version: _version std::endl;for (auto header_kv : _headers_kv){std::cout ))) header_kv.first - header_kv.second std::endl;}}std::string Url(){LOG(DEBUG, Client Want url %s\n, _url.c_str());return _url;}std::string Path(){LOG(DEBUG, Client Want path %s\n, _path.c_str());return _path;}std::string Suffix(){return _suffix;}std::string Method(){LOG(DEBUG, Client request method is %s\n, _method.c_str());return _method;}std::string GetResuestBody(){LOG(DEBUG, Client request method is %s, args: %s, request path: %s\n,_method.c_str(), _body_text.c_str(), _path.c_str());return _body_text;}private:// 基本HttpRequwst格式std::string _req_line;std::vectorstd::string _req_headers;std::string _blank_line;std::string _body_text;// 更详细的数据std::string _method;std::string _url;std::string _version;std::string _path;std::string _suffix; // 资源后缀std::unordered_mapstd::string, std::string _headers_kv; }; 1.4.2 Http应答 Http应答与请求格式类似也分为4部分 状态行格式HTTP版本空格状态码空格状态码描述\r\n相应报头响应头部与请求头部类似为响应报文添加了一些附加信息。key : 空格value空行响应正文响应正文是服务器返回给客户端的数据部分包含了服务器对客户端请求的响应内容。响应正文的格式和类型由响应头部中的Content-Type字段指定。 对于相应来说我们只需要序列化反序列化的工作是由客户端来实现的将序列化字符串发送给客户端即可 class HttpResponse { public:HttpResponse() : _verison(httpversion), _blank_line(base_sep){}void AddCode(int code, const std::string desc){_status_code code;_desc desc;}void AddHeader(const std::string k, const std::string v){_headers_kv[k] v;}void AddBodyText(const std::string body_text){_resp_body_text body_text;}std::string Serialize(){// 构建状态行_status_line _verison space_sep std::to_string(_status_code) space_sep _desc base_sep;// 2. 构建应答报头for (auto header : _headers_kv){std::string header_line header.first line_sep header.second base_sep;_resp_headers.push_back(header_line);}// 空行在构造函数实现了// 正式序列化std::string responsestr _status_line;for (auto line : _resp_headers){responsestr line;}responsestr _blank_line;responsestr _resp_body_text;return responsestr;}private:// httpresponse base 属性std::string _verison;int _status_code;std::string _desc;std::unordered_mapstd::string, std::string _headers_kv;// 基本的httpResponse的格式std::string _status_line;std::vectorstd::string _resp_headers;std::string _blank_line;std::string _resp_body_text; }; 1.5 HTTP 的方法 方法说明支持的HTTP协议版本GET获取资源1.0 1.1POST      传输实体1.0 1.1HEAD获得报文首部1.0 1.1DELETE删除文件1.0 1.1OPTIONS询问支持方法1.0TRACE追踪路径1.0PUT传输文件1.0 1.1CONNECT要求用隧道协议连接代理1.0LINK建立和资源之间的联系1.0UNLINK断开连接关系1.0 在这些方法中使用最多的是GET方法和POST方法其中GET方法使用的是最多的。 GET 用于请求 URL 指定的资源POST用于传输实体的主体通常用于提交表单数据。 两者传输数据的方式不同GET方法通过url传参而POST方法则是将参数放到了正文中 1.6 HTTP 的状态码 状态码按照首位数字的不同可以分为五类 类别原因短语1xxInformational信息性状态码接收的请求正在处理2xxSuccess成功状态码请求正常处理完毕3xxRedirection重定向状态码需要进行附加操作以完成请求4xxClient Error客户端错误状态码服务器无法处理请求5xxServer Error服务器错误状态码服务器处理请求出错 最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway) 重定向状态码 301永久重定向 当服务器返回 HTTP 301 状态码时表示请求的资源已经被永久移动到新的位置。 在这种情况下服务器会在响应中添加一个 Location 头部用于指定资源的新位 置。这个 Location 头部包含了新的 URL 地址浏览器会自动重定向到该地址。 例如在 HTTP 响应中可能会看到类似于以下的头部信息 C HTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\n 一般用于网站换域名后自动跳转到新域名 搜索引擎更新网站链接时使用 302临时重定向 当服务器返回 HTTP 302 状态码时表示请求的资源临时被移动到新的位置。 • 同样地服务器也会在响应中添加一个 Location 头部来指定资源的新位置。浏览 器会暂时使用新的 URL 进行后续的请求但不会缓存这个重定向。 例如在 HTTP 响应中可能会看到类似于以下的头部信息 C HTTP/1.1 302 Found\r\n Location: https://www.new-url.com\r\n 一般用于当用户登录成功后跳转到另一个页面 无论是 HTTP 301 还是 HTTP 302 重定向都需要依赖 Location 选项来指定资 源的新位置。这个 Location 选项是一个标准的 HTTP 响应头部用于告诉浏览器应该 将请求重定向到哪个新的 URL 地址。 1.7 HTTP 常见 Header Content-Type: 数据类型(text/html 等)Content-Length: Body 的长度Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;User-Agent: 声明用户的操作系统和浏览器版本信息;referer: 当前页面是从哪个页面跳转过来的;Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能; 关于 connection 报头 HTTP 中的 Connection 字段是 HTTP 报文头的一部分它主要用于控制和管理客户 端与服务器之间的连接状态 核心作用 • 管理持久连接Connection 字段还用于管理持久连接也称为长连接。持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接以便在同一个连接 上发送多个请求和接收多个响应。 持久连接长连接 • HTTP/1.1在 HTTP/1.1 协议中默认使用持久连接。当客户端和服务器都不明 确指定关闭连接时连接将保持打开状态以便后续的请求和响应可以复用同一个连 接。 • HTTP/1.0在 HTTP/1.0 协议中默认连接是非持久的。如果希望在 HTTP/1.0 上实现持久连接需要在请求头中显式设置 Connection: keep-alive。 语法格式 • Connection: keep-alive表示希望保持连接以复用 TCP 连接。 • Connection: close表示请求/响应完成后应该关闭 TCP 连接。 class HttpServer { private:std::string GetFile(std::string path){std::ifstream in(path, std::ios::binary);if (!in.is_open())return std::string();in.seekg(0, in.end);int filesize in.tellg(); // 计算rw偏移量in.seekg(0, in.beg);std::string content;content.resize(filesize);in.read((char *)content.c_str(), filesize);in.close();return content;}public:HttpServer(){_mine_type.insert(std::make_pair(.html, text/html));_mine_type.insert(std::make_pair(.jpg, image/jpeg));_mine_type.insert(std::make_pair(.png, image/png));_mine_type.insert(std::make_pair(.default, text/html));_code_to_desc.insert(std::make_pair(100, Continue));_code_to_desc.insert(std::make_pair(200, OK));_code_to_desc.insert(std::make_pair(201, Created));_code_to_desc.insert(std::make_pair(301, Moved Permanently));_code_to_desc.insert(std::make_pair(302, Found));_code_to_desc.insert(std::make_pair(404, Not Found));}std::string HandlerHttpRequest(std::string reqstr){std::cout --------------------------------------- std::endl;std::cout reqstr;std::cout --------------------------------------- std::endl;HttpRequest req;req.DeSerialize(reqstr);HttpResponse resp;if (req.Path() wwwroot/redir){// 处理重定向std::string redir_path https://www.qq.com;// resp.AddCode(302, _code_to_desc[302]);resp.AddCode(301, _code_to_desc[301]);resp.AddHeader(Location, redir_path);}else{std::string content GetFile(req.Path()); // 读取目标文件内容if (content.empty()) // 文件不存在{content GetFile(wwwroot/404.html);resp.AddCode(404, _code_to_desc[404]);resp.AddHeader(Content-Length, std::to_string(content.size()));resp.AddHeader(Content-Type, _mine_type[.html]);resp.AddBodyText(content);}else{resp.AddCode(200, _code_to_desc[200]);resp.AddHeader(Content-Length, std::to_string(content.size()));resp.AddHeader(Content-Type, _mine_type[req.Suffix()]);resp.AddBodyText(content);}}std::string respstr resp.Serialize();return respstr;} private:std::unordered_mapstd::string, std::string _mine_type;std::unordered_mapint, std::string _code_to_desc; }; 1.8 通过url调取服务 客户端不仅可以访问我们机器上的静态资源也可以调取一些服务例如当我们在百度搜索hello https://cn.bing.com/search?qhelloqsnformQBREsp-1lq0pqhellosc10-5skcvid3B4149A5C11047A4BD8B5A2487B2D895ghsh0ghacc0ghpl 我们知道cn.bing.com时百度的域名后面紧跟的/search是我们要访问的路径后面是传递的参数域名后面的/path既可以是一种资源也可以是一种服务这里的/search明显是利用后面的参数区调用search服务了 我们实现的时候可以使用哈希表利用域名后面的路径来索引我们要执行的服务 using func_tstd::functionHttpResponse(HttpRequest); class HttpServer { private:std::string GetFile(std::string path){std::ifstream in(path, std::ios::binary);if (!in.is_open())return std::string();in.seekg(0, in.end);int filesize in.tellg(); // 计算rw偏移量in.seekg(0, in.beg);std::string content;content.resize(filesize);in.read((char *)content.c_str(), filesize);in.close();return content;}public:HttpServer(){_mine_type.insert(std::make_pair(.html, text/html));_mine_type.insert(std::make_pair(.jpg, image/jpeg));_mine_type.insert(std::make_pair(.png, image/png));_mine_type.insert(std::make_pair(.default, text/html));_code_to_desc.insert(std::make_pair(100, Continue));_code_to_desc.insert(std::make_pair(200, OK));_code_to_desc.insert(std::make_pair(201, Created));_code_to_desc.insert(std::make_pair(301, Moved Permanently));_code_to_desc.insert(std::make_pair(302, Found));_code_to_desc.insert(std::make_pair(404, Not Found));}std::string HandlerHttpRequest(std::string reqstr){ #ifdef TESTstd::cout --------------------------------------- std::endl;std::cout reqstr;std::string responsestr HTTP/1.1 200 OK\r\n;responsestr Content-Type: text/html\r\n;responsestr \r\n;responsestr htmlh1hello Linux, hello bite!/h1/html;return responsestr; #elsestd::cout --------------------------------------- std::endl;std::cout reqstr;std::cout --------------------------------------- std::endl;HttpRequest req;req.DeSerialize(reqstr);HttpResponse resp;if (req.Path() wwwroot/redir){// 处理重定向std::string redir_path https://www.qq.com;// resp.AddCode(302, _code_to_desc[302]);resp.AddCode(301, _code_to_desc[301]);resp.AddHeader(Location, redir_path);}else if(!req.GetResuestBody().empty()){if(IsServiceExists(req.Path())){_service_list[req.Path()](req);}}else{std::string content GetFile(req.Path()); // 读取目标文件内容if (content.empty()) // 文件不存在{content GetFile(wwwroot/404.html);resp.AddCode(404, _code_to_desc[404]);resp.AddHeader(Content-Length, std::to_string(content.size()));resp.AddHeader(Content-Type, _mine_type[.html]);resp.AddBodyText(content);}else{resp.AddCode(200, _code_to_desc[200]);resp.AddHeader(Content-Length, std::to_string(content.size()));resp.AddHeader(Content-Type, _mine_type[req.Suffix()]);resp.AddBodyText(content);}}std::string respstr resp.Serialize();return respstr; #endif}void InsertService(const std::string servicename,func_t func){std::string s prefixpath servicename;_service_list[s]func;}bool IsServiceExists(const std::string servicename){auto iter _service_list.find(servicename);if(iter _service_list.end()) return false;else return true;} private:std::unordered_mapstd::string, std::string _mine_type;std::unordered_mapint, std::string _code_to_desc;std::unordered_mapstd::string, func_t _service_list; }; #includeTcpServer.hpp #includehttp.hppHttpResponse Login(HttpRequest req) {HttpResponse resp;std::cout 外部已经拿到了参数了: std::endl;req.GetResuestBody();std::cout ####################### std::endl;resp.AddCode(200, OK);resp.AddBodyText(htmlh1result done!/h1/html);// usernamehelloworlduserpasswd123456// 1. pipe// 2. dup2// 3. fork();// 4. exec* - python, PHP, 甚至是Javareturn resp; } int main(int argc,char* argv[]) {if(argc2){std::cerrUsage:argv[0]Server portstd::endl;exit(0);}uint16_t portstd::stoi(argv[1]);HttpServer http;http.InsertService(/login,Login);std::unique_ptrTcpServer tsvrstd::make_uniqueTcpServer(std::bind(HttpServer::HandlerHttpRequest,http,std::placeholders::_1),port);tsvr-Run();return 0; }
文章转载自:
http://www.morning.gjfym.cn.gov.cn.gjfym.cn
http://www.morning.dmcxh.cn.gov.cn.dmcxh.cn
http://www.morning.8yitong.com.gov.cn.8yitong.com
http://www.morning.bflwj.cn.gov.cn.bflwj.cn
http://www.morning.xylxm.cn.gov.cn.xylxm.cn
http://www.morning.mjbnp.cn.gov.cn.mjbnp.cn
http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn
http://www.morning.yxyyp.cn.gov.cn.yxyyp.cn
http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn
http://www.morning.kwhrq.cn.gov.cn.kwhrq.cn
http://www.morning.bgpch.cn.gov.cn.bgpch.cn
http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn
http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn
http://www.morning.xlztn.cn.gov.cn.xlztn.cn
http://www.morning.plkrl.cn.gov.cn.plkrl.cn
http://www.morning.jfbgn.cn.gov.cn.jfbgn.cn
http://www.morning.yngtl.cn.gov.cn.yngtl.cn
http://www.morning.nbrdx.cn.gov.cn.nbrdx.cn
http://www.morning.dbphz.cn.gov.cn.dbphz.cn
http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn
http://www.morning.jghqc.cn.gov.cn.jghqc.cn
http://www.morning.qnbzs.cn.gov.cn.qnbzs.cn
http://www.morning.qszyd.cn.gov.cn.qszyd.cn
http://www.morning.qwwcf.cn.gov.cn.qwwcf.cn
http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn
http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn
http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn
http://www.morning.burpgr.cn.gov.cn.burpgr.cn
http://www.morning.wknbc.cn.gov.cn.wknbc.cn
http://www.morning.rczrq.cn.gov.cn.rczrq.cn
http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn
http://www.morning.bdzps.cn.gov.cn.bdzps.cn
http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn
http://www.morning.sqfnx.cn.gov.cn.sqfnx.cn
http://www.morning.ghssm.cn.gov.cn.ghssm.cn
http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn
http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn
http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn
http://www.morning.hgscb.cn.gov.cn.hgscb.cn
http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn
http://www.morning.bxdlrcz.cn.gov.cn.bxdlrcz.cn
http://www.morning.hdnd.cn.gov.cn.hdnd.cn
http://www.morning.bgygx.cn.gov.cn.bgygx.cn
http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn
http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn
http://www.morning.bgpb.cn.gov.cn.bgpb.cn
http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn
http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn
http://www.morning.rknhd.cn.gov.cn.rknhd.cn
http://www.morning.nkyc.cn.gov.cn.nkyc.cn
http://www.morning.hkng.cn.gov.cn.hkng.cn
http://www.morning.jyznn.cn.gov.cn.jyznn.cn
http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn
http://www.morning.nlcw.cn.gov.cn.nlcw.cn
http://www.morning.gbyng.cn.gov.cn.gbyng.cn
http://www.morning.htbgz.cn.gov.cn.htbgz.cn
http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn
http://www.morning.ghphp.cn.gov.cn.ghphp.cn
http://www.morning.hjrjy.cn.gov.cn.hjrjy.cn
http://www.morning.yckrm.cn.gov.cn.yckrm.cn
http://www.morning.frpfk.cn.gov.cn.frpfk.cn
http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn
http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn
http://www.morning.thrgp.cn.gov.cn.thrgp.cn
http://www.morning.pfggj.cn.gov.cn.pfggj.cn
http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn
http://www.morning.mlyq.cn.gov.cn.mlyq.cn
http://www.morning.jbtwq.cn.gov.cn.jbtwq.cn
http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn
http://www.morning.pxspq.cn.gov.cn.pxspq.cn
http://www.morning.plqsc.cn.gov.cn.plqsc.cn
http://www.morning.zcsch.cn.gov.cn.zcsch.cn
http://www.morning.mhybs.cn.gov.cn.mhybs.cn
http://www.morning.kbyp.cn.gov.cn.kbyp.cn
http://www.morning.xnyfn.cn.gov.cn.xnyfn.cn
http://www.morning.wdqhg.cn.gov.cn.wdqhg.cn
http://www.morning.gklxm.cn.gov.cn.gklxm.cn
http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn
http://www.morning.rshs.cn.gov.cn.rshs.cn
http://www.morning.rqxmz.cn.gov.cn.rqxmz.cn
http://www.tj-hxxt.cn/news/246962.html

相关文章:

  • 南昌市科协网站泵阀网站建设
  • 宝山网站建设制作网站排名大全
  • 广州企业网站互联网企业营销策略
  • 三合一网站建站ip分享网站
  • 网站建设标准网站如何进行网络推广
  • 开发一个功能网站多少钱seo公司网站推广
  • 网站的登录界面是怎么做的常州市建设局网站资质
  • 上海市普陀区建设规划局网站杭州索象营销策划有限公司
  • 创建网站制作仪表企业百度快速排名
  • php网站开发方案哪里有网站开发定制
  • 江苏省常州建设高等职业技术学校网站暴雪王
  • 设计的素材网站有哪些视频教育网站开发
  • 网站 备份 还原专业的网站建设找聚爱
  • 福建省住房和城乡建设网站律师建网站
  • 建设网站的书籍自己做的网站打不开怎么回事
  • 网站网页设计在哪找买一个商标大概要多少钱
  • 医院网站网站建设分金手指排名十三
  • 做网站能赚多少钱群晖nas可以做网站
  • php网站建设一流程免费制作app平台
  • 网站开发 协作平台wordpress付费汉化主题
  • 建设视频网站流量电商怎么做营销推广天气预报
  • 注册公司去哪个网站免费手机网页网站
  • 无锡宜兴网站建设网站互动优化
  • 网站底部关键词指向邢台房产网
  • 药品网站建设郑州小学班级网站建设
  • 关键词分为哪几类蚁百杭州网站seo优化
  • 河北省电力建设第一工程公司网站大余网站
  • metro风格网站移动官网网站建设
  • 加强政务公开网站建设室内在线设计网站
  • wordpress not found济南seo网站关键词排名