在Linux下与在windos下编程没啥区别,可以在windos上实现后,然后更改一些,移植到linux中

yum install gcc
yum install gcc-c++

vi main.cpp    内容如下

#include <iostream>
using namespace std;
int main(){
cout << "Hello World" << endl;
return 0;
}
g++ main.cpp            //生成.out  文件
./main.out
或者
g++ main.cpp -o main.out
或者
g++ main.cpp -o main

这样生成的三个文件内容是一样的

 连接mysql

c++需要mysql库(#include<mysql/mysql.h>),需下载mysql-devel

yum install mysql-devel    
mysql_config --libs

vi main.cpp

#include<iostream>             //需加尖括号
#include<mysql/mysql.h>
using namespace std;
void linkToMysql()
{
MYSQL link;
mysql_init(&link);
if(mysql_real_connect(&link,"127.0.0.1","zabbix","zabbix","zabbix",0,NULL,0)==NULL){
cout<<"连接错误";
}else{
cout<<"连接成功";
}
mysql_close(&link);
}
int main(){
linkToMysql();
}

mysql_real_connect()函数原型

MYSQL mysqlrealconnect(
MYSQL mysql,     
const char host,     //ip地址
const char user,     //mysql用户名
const char passwd,    //用户名密码
const char db,      //对应mysql用户可访问数据库名
unsigned int port,     
const char unixsocket,
unsigned intclientflag)

编译并链接文件

g++ -L/usr/lib64/mysql -lmysqlclient -o main main.cpp
./main    

 cgi编程

让apache支持cgi

1.加载 CGI 支持模块,打开 Apache 配置文件(/etc/httpd/conf),寻找 LoadModule cgi_module modules/mod_cgi.so 解除前面的 #

2.定义 CGI 运行目录,解除在 Apache 配置文件中 ScriptAlias /cgi-bin/ "/var/www/cgi-bin" 前面的 # ( 根据实际情况而定)

3.启用对 CGI 的支持,解除在 Apache 配置文件中 AddHandler cgi-script .cgi 前面的 #

4.修改为如下

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI indexes FollowSymLinks
Require all granted
AddHandler cgi-script .cgi
</Directory>

简单测试一下

注意是在 /var/www/cgi-bin  目录

a.cpp

#include <iostream>
using namespace std;
int main ()
{
cout<<"Content-Type: text/html\n\n";
cout<<"hi";
return 0;
}
//编译
g++ a.cpp -o a.cgi

访问 http://192.168.43.8/cgi-bin/a.cgi

测试时出现500错误,查看错误日志显示:End of script output before headers

原因:我没加下面这句

cout<<"Content-Type: text/html\n\n";  

html 与 c 交互 (get传值给c)

在/var/www/html  下建一个cgi.html文件

内容如下

<body>
<form name="form1" action="/cgi-bin/pass.cgi" method="get">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用户名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 码</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 录"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>

在/var/www/cgi-bin  建一个pass.c , 然后编译为pass.cgi    gcc pass.c -o pass.cgi

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
char *input;
char *req_method;
char name[64];
char pass[64];
int i = 0;
int j = 0; // printf("Content-type: text/plain; charset=iso-8859-1\n\n");
printf("Content-type: text/html\n\n");
printf("The following is query reuslt:<br><br>"); req_method = getenv("REQUEST_METHOD");
input = getcgidata(stdin, req_method); // 我们获取的input字符串可能像如下的形式
// Username="admin"&Password="aaaaa"
// 其中"Username="和"&Password="都是固定的
// 而"admin"和"aaaaa"都是变化的,也是我们要获取的 // 前面9个字符是UserName=
// 在"UserName="和"&"之间的是我们要取出来的用户名
for ( i = 9; i < (int)strlen(input); i++ )
{
if ( input[i] == '&' )
{
name[j] = '\0';
break;
}
name[j++] = input[i];
} // 前面9个字符 + "&Password="10个字符 + Username的字符数
// 是我们不要的,故省略掉,不拷贝
for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
{
pass[j++] = input[i];
}
pass[j] = '\0'; printf("Your Username is %s<br>Your Password is %s<br> \n", name, pass); return 0;
} char* getcgidata(FILE* fp, char* requestmethod)
{
char* input;
int len;
int size = 1024;
int i = 0; if (!strcmp(requestmethod, "GET"))
{
input = getenv("QUERY_STRING");
return input;
}
else if (!strcmp(requestmethod, "POST"))
{
len = atoi(getenv("CONTENT_LENGTH"));
input = (char*)malloc(sizeof(char)*(size + 1)); if (len == 0)
{
input[0] = '\0';
return input;
} while(1)
{
input[i] = (char)fgetc(fp);
if (i == size)
{
input[i+1] = '\0';
return input;
} --len;
if (feof(fp) || (!(len)))
{
i++;
input[i] = '\0';
return input;
}
i++; }
}
return NULL;
}

记得给cgi.html  赋予777或755权限,我修改了半天文件,文件就是没更新,原因就是没给权限

访问http://192.168.43.8/cgi.html

输入 admin  123456

完成了c的动态web实现

c++  调用cgicc库 来更加简便的实现web

cgicc 稳定版本3.2.16: http://ftp.gnu.org/gnu/cgicc/cgicc-3.2.16.tar.gz

$ tar xzf cgicc-X.X.X.tar.gz
$ cd cgicc-X.X.X/
$ ./configure --prefix=/usr
$ make
$ make install

注意:libcgicc.so 和 libcgicc.a 库会被安装到/usr/lib目录下,需执行拷贝命令:

$ sudo cp /usr/lib/libcgicc.* /usr/lib64/

才能使 CGI 程序自动找到 libcgicc.so 动态链接库。

先熟悉cgicc库的各种类,方法和属性

https://www.cnblogs.com/aquester/archive/2018/12/04/10064335.html

cgicc官方开发文档:http://www.gnu.org/software/cgicc/doc/lib_overview.html

https://www.cnblogs.com/skawu/p/11069290.html

CGICC由两大部分组成:

  1) CGI输入处理子模块(CGI classes):

    cgicc::Cgicc 是cgicc库的主类。它用于检索特定HTML表单元素(如复选框、单选按钮和文本字段),上载文件的信息,以及保存,还原和检索CGI环境的信息和组:

    cgicc::CgiEnvironment 封装从HTTP服务器传递到CGI应用程序的数据。这包括由CGI标准中指定的HTTP服务器设置的所有环境变量。

    cgicc::FormEntry是一个不可变的类,表示HTML表单元素(如文本字段、单选按钮或复选框)中的单个用户条目。FormEntry本质上是一个名称/值对,其中名称是HTML表单本身中指定的表单元素的名称,值是用户输入的或用户选择的值。FormEntry提供了允许以字符串、整数或双精度形式访问值的方法。

    cgicc::FormFile是一个不可变的类,表示通过HTTP文件上载机制上载的文件。FormFile与FormEntry非常相似,但没有提供以不同类型访问值的众多方法。

  2) 响应生成子模块(Response generation classes):

    1) http header classes

cgicc::HTTPCookie是一个名称/值对,用于使用调用方自己的计算机存储调用方的一段信息。cookie通常被用作识别用户的一种手段。cgicc的任何头类都可能包含任意数量的cookie

cgicc::HTTPHeader 是所有简单HTTP头的基类。很少直接使用;相反,使用提供的子类之一。

cgicc::HTTPContentHeader 继承 cgicc::HTTPHeader 用于指示CGI应用程序返回给客户端的数据类型。

cgicc::HTTPRedirectHeader 继承cgicc::HTTPHeader 用于将客户端重定向到其他URL。

cgicc::HTTPStatusHeader 继承 cgicc::HTTPHeader 用于返回3位HTTP状态码和相关消息。

cgicc::HTTPHTMLHeader 继承 cgicc::HTTPContentHeader 用于MIME类型text/html的数据。

cgicc::HTTPResponseHeader 是一个更强大的通用HTTP头类,用于构造完整的HTTP响应。

    1) HTML generation classes

    HTML生成类用于在任何HTTP头之后生成HTML响应,由三部分组成。

      包含HTML版本信息的行

      声明性头段(由head元素分隔)

      包含文档实际内容的正文

cgicc定义了两个特殊的HTML类:
cgicc::HTMLDoctype用于指定HTML4.0标准所要求的HTML版本信息
cgicc::comment用于表示HTML注释

下面是输入处理子模块

 简单实现一个通过post登录

/var/www/html  下放置login.html 文件

<body>
<form name="form1" action="/cgi-bin/text.cgi" method="post">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用户名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 码</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 录"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>

/var/www/cgi-bin  下放置 text.cpp文件

#include <iostream>
#include <string>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main ()
{
cout<<"Content-Type: text/html\n\n";
Cgicc cgi;
form_iterator username = cgi.getElement("Username");
form_iterator password = cgi.getElement("Password");
if(username->getValue()=="admin"){
if(password->getValue()=="123456")
cout<< "login success!!";
  else
    cout<< "password error";
}
else
cout<< "error login";
return 0;
}
g++ -o text.cgi text.cpp -l cgicc

这里介绍cgi类下的 getElement()函数,传入html的name

getElement() 实现了方法重载,上面我们使用的是第一个,返回form_iterator

form_iterator 和const_form_iterator 都是FormEntry的别名

通过调用FormEntry 类中的getValue()函数即可得到输入框的值,然后再做比较

下面通过连接mysql,来对用户密码确认

c++连接mysql 需要 mysql-server , mysql-client, mysql-devel

然后创建用户,数据库等

下面为简单的检测是否连接数据库

#include<iostream>
#include<mysql/mysql.h>
using namespace std;
int main(){
MYSQL conn;
mysql_init(&conn);
 if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字
{
cout<<"Content-Type: text/html\n\n";
cout<<"connect success!";
}
}
编译
g++ `mysql_config --cflags --libs` -o mysql.cgi mysql.cpp

更深一步,就是增删改查,更多mysql语句请参考:https://www.cnblogs.com/CloudComputing-binbin/p/14470008.html

下面是结合c++ msyql

参考:

c++ 使用mysql查询结果为空的解决方法:https://blog.csdn.net/weixin_39616287/article/details/113686946

 mysql 查询语句测试

#include<iostream>
#include<mysql/mysql.h>
using namespace std;
int main(){
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row; mysql_init(&conn);
cout<<"Content-Type: text/html\n\n";
if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字
{
if(mysql_query(&conn,"select username from account where username='admin' and password='123456';"))  //执行sql
cout<<"query fail...";
else{
cout<<"query success!!";
result=mysql_store_result(&conn);
int i=0;
while((row=mysql_fetch_row(result))){      //获取每行
i++;
cout<<"<script>alert('welcome to "<<row[0]<<"')</script>";     
}
if(i==0)   //判断查询是否为空
cout<<"<script>alert('"<<"username or password error..."<<"')</script>";
}
}
else
cout<<"connetc fail...";
}

mysql 与cgi 结合使用,html文件还是上面的文件

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
#include <cgicc/HTTPRedirectHeader.h>
using namespace std;
using namespace cgicc;
int main ()
{
cout<<"Content-Type: text/html\n\n";
Cgicc cgi;
form_iterator username = cgi.getElement("Username");
form_iterator password = cgi.getElement("Password");
string sql="select username from account where username='";
sql+=username->getValue(); //getValue() 的返回值为string
sql+="' and password='";
sql+=password->getValue();
sql+="';";
const char* sql_=sql.c_str(); MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row; mysql_init(&conn);
if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字
{
if(mysql_query(&conn,sql_)) //执行sql
cout<<"query fail...";
else{
cout<<"query success!!";
result=mysql_store_result(&conn);
int i=0;
while((row=mysql_fetch_row(result))){
i++;
cout<<"<script>alert('welcome to "<<row[0]<<"')</script>";
}
if(i==0) //通过查询出行的计数,来判断是否查询成功
cout<<"<script>alert('"<<"username or password error..."<<"')</script>";
cout<<"<script>window.location.href='http://118.195.139.82/login.html'</script>"; //登录失败,跳转登录页面
}
}
else
cout<<"connetc fail..."; }
g++ `mysql_config --cflags --libs` -l cgicc -o text.cgi text.cpp

最后就是cgicc + mysql + cookie 实现登录

cookie的学习参考菜鸟教程:  https://www.runoob.com/cplusplus/cpp-web-programming.html

下面是实现的主类  header.h

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
#include <cgicc/HTTPRedirectHeader.h>
#include <stdio.h> //sprintf() 需要用到该库
#include <sstream> //用于整型转字符串
#include <cstdlib> //用于随机数
#include <openssl/sha.h> //哈希加密
using namespace std;
using namespace cgicc; class main_{
public:
int login(){
Cgicc cgi;
form_iterator username = cgi.getElement("Username");
form_iterator password = cgi.getElement("Password");
string sql="select username from account where username='";
sql+=username->getValue(); //getValue() 的返回值为string
sql+="' and password='";
sql+=password->getValue();
sql+="';";
const char* sql_=sql.c_str(); MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row; mysql_init(&conn);
if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字
{
if(mysql_query(&conn,sql_)){} //执行sql ,执行失败返回1
//cout<<"query fail...";
else{
//cout<<"query success!!";
result=mysql_store_result(&conn);
int i=0;
while((row=mysql_fetch_row(result))){
i++;
setcookie(username->getValue(),password->getValue());
cout<<"<script>alert('welcome to "<<row[0]<<"')</script>";
return 1;
}
if(i==0){ //通过查询出行的计数,来判断是否查询成功
cout<<"Content-Type: text/html\n\n"; //这句要加上,不然就出现解析错误了,alert语句就显示不了
cout<<"<script>alert('"<<"username or password error..."<<"')</script>";
cout<<"<script>window.location.href='http://118.195.139.82/login.html'</script>"; //登录失败,跳转登录页面
return 0;
}
}
}
else{
cout<<"Content-Type: text/html\n\n";
cout<<"connetc fail...";
} }
void setcookie(string username,string password){
string sessid="Set-Cookie:Sessid=";
sessid+=set_cookie_sha(username,password);
sessid+=";";
cout<<sessid;
cout<<"Content-Type: text/html\n\n"; //cookie 要在c
}
int check_cookie(){
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row;
mysql_init(&conn);
mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS);
string sql="select * from cookie_time where cookie='"; Cgicc cgi;
const_cookie_iterator cci;
const CgiEnvironment& env = cgi.getEnvironment();
for( cci = env.getCookieList().begin();cci != env.getCookieList().end(); ++cci ){
if(cci->getName()=="Sessid"){
sql+=cci->getValue();
sql+="' limit 1;";
mysql_query(&conn,sql.c_str());
result=mysql_store_result(&conn);
int i=0;
while((row=mysql_fetch_row(result))){
i++;
}
if(i==1){
//cout<<"success! ";
return 1;
}
else
return 0;
}
}
}
string set_cookie_sha(string username,string password){
stringstream str_t;
stringstream str_r;
int t=time(0);
srand(t);
int rand=random();
str_t << t;
str_r << rand;
string str_time=str_t.str();
string str_rand=str_r.str();
//cout<<str_time<<str_rand<<"admin123456"<<endl;
string cookie=str_time+str_rand+username+password; //时间戳+随机数+用户名密码
//cout << sha256("dfs") << endl;
string sha_cookie=sha256(cookie);
insert_cookie(sha_cookie,str_time);
return sha_cookie;
}
void insert_cookie(string cookie,string str_time){
string sql="insert into cookie_time(cookie,time)values('";
sql+=cookie;
sql+="',";
sql+=str_time;
sql+=");";
const char* sql_=sql.c_str(); MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row; mysql_init(&conn);
if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)){
if(mysql_query(&conn,sql_)){}
}
}
string sha256(const string str){
char buf[2];
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
string NewString = "";
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){
sprintf(buf,"%02x",hash[i]);
NewString = NewString + buf;
}
return NewString;
}
};

check.cpp  //调用类的login() 来检测登录密码, 直接访问会出错

#include <iostream>
#include "header.h"
int main ()
{
main_ a;
if(a.login()==1){
cout<<"<script>window.location.href='http://118.195.139.82/cgi-bin/home.cgi'</script>";
} }

home.cpp  //这就是通过登录后的系统界面, 直接访问没有cookie或cookie错误的会页面跳转到登陆界面,

#include "header.h"
int main(){
cout << "Content-type:text/html\n\n";
main_ ma;
if(ma.check_cookie()==0){
cout<<"<script>alert('"<<"please login..."<<"')</script>";
cout<<"<script>window.location.href='http://118.195.139.82/login.html'</script>";
return 0;
}
cout<<"good night!";
}

login.html

<body>
<form name="form1" action="/cgi-bin/check.cgi" method="post">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用户名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 码</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 录"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>
g++ `mysql_config --cflags --libs` -l cgicc -l ssl -l crypto -o check.cgi check.cpp
g++ `mysql_config --cflags --libs` -l cgicc -l ssl -l crypto -o home.cgi home.cpp

实现:

cookie是用 时间戳+随机数+用户密码 的sha加密

cookie 以及cookie授予的时间存入数据库中,创建事件,过期的cookie将被删除

检查cookie是用查询的,没做任何过滤,存在太low的sql注入了

cookie也是

想了想,盲注不照样爆库么,限定字符只有数字字母,这样应该就全防吧

还有创建定时删除过期cookie事务

参考:https://www.cnblogs.com/wang-yaz/p/12424858.html

开启mysql事务功能,永久开启方法:/etc/my.cnf中[mysqld]添加event_scheduler=on #重启服务

create table cookie_time(cookie varchar(100),time int);
create event de_cookie on schedule every 5 second do delete from cookie where time<(unix_timestamp(now())-60); //每五秒删除前一分钟的数据
create event de_cookie on schedule every 1 hour do delete from cookie where time<(unix_timestamp(now())-14400); //每一小时删除前4小时的数据

c++ 哈希加密:https://www.cnblogs.com/CloudComputing-binbin/p/14754486.html

注册

register.html

#include"header.h"
int main(){
cout << "Content-type:text/html\n\n"; Cgicc cgi;
form_iterator password = cgi.getElement("Password");
form_iterator password_check = cgi.getElement("Password_check");
if(password->getValue()!=password_check->getValue()){ //两次密码是否正确
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Password Not Match',text:'Check your password again',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";
return 0;
} form_iterator username = cgi.getElement("Username");
main_bypass bypass;
if(bypass.bypass(username->getValue())==0||bypass.bypass(password->getValue())==0){ //过滤输入值,只允许字母和数字
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Forbidden Character',text:'Letters and numbers only allowed',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>";
return 0;
}else if(bypass.bypass(username->getValue())==2||bypass.bypass(password->getValue())==2){
cout<<"Content-Type: text/html\n\n";
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Character Too Short',text:'5~20 characters only',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";
return 0;
} MYSQL conn; //连个数据库
mysql_init(&conn);
mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS); //查询是否注册过
MYSQL_RES *result;
MYSQL_ROW row;
string sql_one="select username from account where username='"+username->getValue()+"';";
mysql_query(&conn,sql_one.c_str());
result=mysql_store_result(&conn);
int i=0;
while((row=mysql_fetch_row(result))){
i++;
}
if(i==1){
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Already Register',text:'Please login',type: 'info',confirmButtonColor: '#DD6B55',confirmButtonText: 'login', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>";
return 0;
} //检验验证码
form_iterator qqmail = cgi.getElement("qqmail");
form_iterator code = cgi.getElement("code");
if(bypass.bypass_code(code->getValue())==0||bypass.bypass_qqmail(qqmail->getValue())==0){
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Identifying Code Error',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";
return 0;
} string sql_two="select code from qqmail_code where qqmail='"+qqmail->getValue()+"';";
mysql_query(&conn,sql_two.c_str());
result=mysql_store_result(&conn);
i=0;
while((row=mysql_fetch_row(result))){
if(row[0]==code->getValue()){
i++;
break;
}
}
if(i==0){
cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Identifying Code Error',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";
return 0;
} //插入用户密码
string sql_three="insert into account(username,password,qqmail)values('"+username->getValue()+"','"+password->getValue()+"','"+qqmail->getValue()+"');";
mysql_query(&conn,sql_three.c_str()); cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";
cout<<"<body><script> swal({ title: 'Register Successful',type: 'success',confirmButtonColor: '#DD6B55',confirmButtonText: 'login', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>"; return 0; }

参考:

linux下c++编程基础:https://blog.csdn.net/qq_33750826/article/details/83868555

让apache支持cgi:https://www.txisfine.cn/archives/37d1a4ec.html#%E9%85%8D%E7%BD%AE%E8%BF%87%E7%A8%8B

c++ cgi 菜鸟教程:https://www.runoob.com/cplusplus/cpp-web-programming.html

开源C加加版本CGI库CGICC入门.pdf:

https://www.cnblogs.com/aquester/archive/2018/12/04/10064335.html

https://files-cdn.cnblogs.com/files/aquester/%E5%BC%80%E6%BA%90C%E5%8A%A0%E5%8A%A0%E7%89%88%E6%9C%ACCGI%E5%BA%93CGICC%E5%85%A5%E9%97%A8.pdf

cgicc库官方开发文档:http://www.gnu.org/software/cgicc/doc/lib_overview.html

c++ char* , const char* , string 的相互转换:https://www.cnblogs.com/wuyepeng/p/9729943.html

linux centos7下 c++编程的更多相关文章

  1. Linux CentOs7 下安装 redis

    Linux CentOs7 下安装 redis 请将以下命令放入linux命令行中运行 如果安装过程前没有安装GCC请先安装  命令如下 $ yum install gcc-c++ $ wget ht ...

  2. (转)LINUX CENTOS7下安装PYTHON

    LINUX CENTOS7下安装PYTHON 原文:http://www.cnblogs.com/lclq/p/5620196.html Posted on 2016-06-27 14:58 南宫羽香 ...

  3. Linux CentOS7下安装Zookeeper-3.4.10服务(最新)

    Linux CentOS7下安装Zookeeper-3.4.10服务(最新) 2017年10月27日 01:25:26 极速-蜗牛 阅读数:1933   版权声明:本文为博主原创文章,未经博主允许不得 ...

  4. Linux - centos7 下 MySQL(mariadb) 和 主从复制

    目录 Linux - centos7 下 MySQL(mariadb) 和 主从复制 MySQL(mariadb) 安装MySQL(mariadb) 配置数据库的中文支持 在远程用 mysql客户端去 ...

  5. Linux(CentOS7)下配置多个tomcat

    记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...

  6. Linux(CentOS7)下安装jdk1.8

    Linux(CentOS7) 下安装 jdk1.8 操作过程. 一.检查是否自带jdk rpm -qa|grep java 如果存在则用下面命令删除,xxx yyy zzz代表查询出来的自带jdk名称 ...

  7. Linux(CentOS7)下Nginx安装

    记录一下 Linux(CentOS7) 下 Nginx 安装过程 一.准备工作 版本说明: Linux版本:CentOS 7 64位 Nginx版本:nginx-1.20.0 1. 下载安装文件 采用 ...

  8. Linux(CentOS7)下二进制安装MySQL5.7.26

    记录一下自己在 CentOS7 下二进制安装 MySQL5.7.26 的过程,之前使用 Linux(CentOS7)下rpm安装MySQL8.0.16 之后发现 rpm 方式安装不利于维护,也不利于单 ...

  9. linux centos7下mysql安装--韩国庆

    首先我先给大家介绍下MariaDB和mysql的区别. 上图,“MySQL之父”的骨灰级程序员Monty,但是mysql被Oracle收购后,Monty又开始去发展另一条数据库的道路,并且以Monty ...

随机推荐

  1. 集合框架-Vector集合

    1 package cn.itcast.p1.vector.demo; 2 3 import java.util.Enumeration; 4 import java.util.Iterator; 5 ...

  2. vue和react 相似和区别

    相似之处 他们都是JavaScript的UI框架,专注于创造前端的富应用 不同于早期的JavaScript框架"功能齐全",Reat与Vue只有框架的骨架,其他的功能如路由.状态管 ...

  3. Elasticsearch使用系列-ES增删查改基本操作+ik分词

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 一.安装可视化工具Kibana ES是一个NoSql数据库应用.和其他数据库 ...

  4. python第三方模块详细教程(紧急情况宝典)

    目录 一:第三方模块 第三方模块:并不是python自带的 需要基于网络下载! 使用下载第三方模块 需要将python pip添加到环境变量 1.验证pip路径添加成功 2.pycharm添加第三方模 ...

  5. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  6. jstl split 分割字符串?

    1. 在已经获得数据的前提下,对数据进行分割,分割后的结果是一个数组,可以通过数组获得我们需要的数据 2. value 是获得值 需要${} 的方式获取, var 是设置变量. var = " ...

  7. 开发升讯威在线客服系统启示录:怎样编写堪比 MSDN 的用户手册

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 免费在线使用 & 免费私有化部署:https://kf.shengxunwei.com 文章目 ...

  8. Maven的安装、配置与使用

    5.Maven 我为什么要学习这个技术? 在JavaWeb开发中,需要使用大量的jar包,我们手动去导入: 如何能够让一个东西自动帮我们导入和配置这个jar包. 由此,Maven诞生! 5.1.Mav ...

  9. ApacheCN Angular 译文集 20211114 更新

    Angular 专家级编程 零.前言 一.架构概述和在 Angular 中构建简单应用 二.将 AngularJS 应用迁移到 Angular 应用 三.使用 Angular CLI 生成具有最佳实践 ...

  10. Nginx网络压缩 CSS压缩 图片压缩 JSON压缩

    一.序言 使用Nginx作为web应用服务时,会代理如下常见文件:js.css.JSON.图片等,本文提供基于Nginx内置的压缩技术,提供网络请求响应速度的解决方案. 1.网络压缩原理 网络压缩的原 ...