虽然是设计高性能分布式系统,但是系统的安全漏洞还是应该尽量避免。前几天,项目当中遇到了sql注入攻击风险,感觉很是头疼,因为向几个黑客朋友请教的结果是没有办法根治,FT。也就是说只要黑客想废掉后台数据库,只要他有决心,就一定能做到,还是做热备比较可靠,其他办法只是能预防简单的攻击。很多符号如果在字符串中,都会有潜在的威胁。例如:
安全sql: select * from table where username = 'netchecking' and password = '123''
危险sql:select * from table where username = 'netchecking' and password = '123';delete * from table;''
把pasword赋值为:123;delete * from table
这样,数据库就被废了。
我在这里使用了一个简单的比较危险字符的方法,全部代码如下(还没有来的急详细测试,暂时叫第一版吧,以后等我完善以后,再给出源代码):
//算法为,先把字符串当中的危险字符变成不可见字符存储,然后再把它读取出来以后,转换成危险字符。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#define DICNUM 9
char SOURCEDIC[] = {')','(','!','@','#','$','%','^','&'};
int CONVERTDIC[] = {128,129,130,131,132,133,134,135,136};
static int checkASC(char p)
{
int i = 0;
for (i=0;i<DICNUM;i++)
{
if (p==(char)CONVERTDIC[i])
{
return i;
}
}
return -1;
}
static int checkSource(char p)
{
int i = 0;
char * op = SOURCEDIC;
for (i=0;i<DICNUM;i++)
{
if (p==(*op))
return i;
op++;
}
return -1;
}
static int convertASC(char* p,int index)
{
*p = SOURCEDIC[index];
return 0x0;
}
static int convertSource(char* p,int index)
{
*p = (char)CONVERTDIC[index];
return 0x0;
}
static int replaceSource(char * buffer,char * result)
{
char * p = NULL;
p = buffer;
int res = 0;
int len = 0;
while(1)
{
res = checkASC(*p);
if (res >= 0x0)
convertASC(p,res);
result[len] = *p;
p++;
len++;
if (len == strlen(buffer)) break;
}
return 0x0;
}
static int replaceASC(char * buffer,char * result)
{
char * p = NULL;
p = buffer;
int res = 0;
int len = 0;
while(1)
{
res = checkSource(*p);
if (res >= 0x0)
convertSource(p,res);
result[len] = *p;
p++;
len++;
if (len == strlen(buffer)) break;
}
return 0x0;
}
int main()
{
char buffer[] = "12ws(((we";
printf("buffer = %s\n",buffer);
char result[254] = {0x0};
memset(result,0x0,254);
replaceASC(buffer,result);
printf("result = %s\n",result);
char res[254] = {0x0};
replaceSource(result,res);
printf("res = %s\n",res);
return 0x0;
}
希望能跟高手们交流sql injection预防技术。