linux centos7下 c++编程
在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++编程的更多相关文章
- Linux CentOs7 下安装 redis
Linux CentOs7 下安装 redis 请将以下命令放入linux命令行中运行 如果安装过程前没有安装GCC请先安装 命令如下 $ yum install gcc-c++ $ wget ht ...
- (转)LINUX CENTOS7下安装PYTHON
LINUX CENTOS7下安装PYTHON 原文:http://www.cnblogs.com/lclq/p/5620196.html Posted on 2016-06-27 14:58 南宫羽香 ...
- Linux CentOS7下安装Zookeeper-3.4.10服务(最新)
Linux CentOS7下安装Zookeeper-3.4.10服务(最新) 2017年10月27日 01:25:26 极速-蜗牛 阅读数:1933 版权声明:本文为博主原创文章,未经博主允许不得 ...
- Linux - centos7 下 MySQL(mariadb) 和 主从复制
目录 Linux - centos7 下 MySQL(mariadb) 和 主从复制 MySQL(mariadb) 安装MySQL(mariadb) 配置数据库的中文支持 在远程用 mysql客户端去 ...
- Linux(CentOS7)下配置多个tomcat
记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...
- Linux(CentOS7)下安装jdk1.8
Linux(CentOS7) 下安装 jdk1.8 操作过程. 一.检查是否自带jdk rpm -qa|grep java 如果存在则用下面命令删除,xxx yyy zzz代表查询出来的自带jdk名称 ...
- Linux(CentOS7)下Nginx安装
记录一下 Linux(CentOS7) 下 Nginx 安装过程 一.准备工作 版本说明: Linux版本:CentOS 7 64位 Nginx版本:nginx-1.20.0 1. 下载安装文件 采用 ...
- Linux(CentOS7)下二进制安装MySQL5.7.26
记录一下自己在 CentOS7 下二进制安装 MySQL5.7.26 的过程,之前使用 Linux(CentOS7)下rpm安装MySQL8.0.16 之后发现 rpm 方式安装不利于维护,也不利于单 ...
- linux centos7下mysql安装--韩国庆
首先我先给大家介绍下MariaDB和mysql的区别. 上图,“MySQL之父”的骨灰级程序员Monty,但是mysql被Oracle收购后,Monty又开始去发展另一条数据库的道路,并且以Monty ...
随机推荐
- 集合框架-工具类-JDK5.0特性-ForEach循环
1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...
- spring内嵌cglib包,这里藏着一个大坑
问题发现 2022-01-21 早上 9 点,订单系统出现大面积的"系统未知错误"报错,导致部分用户无法正常下单.查询后台日志,可以看到大量的 duplicate class at ...
- setuid setgid stick bit 特殊权限 粘滞位
1.setuid与setgid讲解 看一下系统中用到它的地方,以/etc/passwd和/usr/bin/passwd为例: 分析一下,/etc/passwd的权限为 -rw-r--r-- 也就是说: ...
- linux设置定时任务(全面解析教程)
目录 一:系统定时任务 二:系统定时任务配置文件(crontab) 三:增加定时任务 1.crontab -e 2.1.sh 3.2.txt 四:查看crontab定时任务 五:定时任务配置文件(ro ...
- 别人都在认真听课,而我埋头写Python为主播疯狂点点点点点赞!
最近有次在钉钉看直播,发现这个直播非常之精彩,于是情不自禁地想要为主播大佬连刷一波赞: 但我发现,手动连击点赞速度十分不可观.气人的是,钉钉直播不能长按刷赞!这让我很恼怒.心中满怀的激动和兴奋以及对大 ...
- Android Adapter基本理解
感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...
- 关于IBAction、IBOutlet前缀IB的解释
- 全称:Interface Builder - 以前的UI界面开发模式:Xcode3 + Interface Builder - 从Xcode4开始,Interface Builder已经整合到Xc ...
- HMS Core 能力速配,唱响恋爱进行曲
情人节,HMS Core 最具CP感的能力搭档来袭,浓浓爱意,表白各行业,你准备好了吗? 1.ML Kit +Signpal Kit 科技相助,恋爱提速.展现爱意的方式有千百种,你可以用文本翻译学习数 ...
- Msi.h causes compilation error in vs2010
创建一个Win32 Console工程ReadFromMSM,什么都不需要做. 在ReadFromMSM.cpp文件中引入头文件: #include <msi.h> 编译,会发现有成堆的错 ...
- VMware中Ubuntu18配置静态IP地址
1. VMware:编辑 -> 虚拟网络编辑器 -> 更改设置 2. 取消选中:使用本地DHCP服务将IP地址分配给虚拟机,并记住子网ip 3. 点击NAT设置,记住网关地址 正常情况下V ...