Author Archives: Sean
Linux改变文件或目录的访问权限命令
Linux下PhpMyAdmin程序目录的安全管理
PhpMyAdmin是一套放在服务器端的通过浏览器界面管理的程序,因此,确保其目录安全性十分重要,否则,将导致数据被盗取甚至遭到恶意破坏。下面将详细讲述一般的防范措施。
这是很多网站需要用户验证时普遍使用的方法,这样当用户第一次浏览进入该目录时,都将出现一个提示窗口,提示用户输入用户名和密码验证,其是通过使用Apache Server的标准 mod_auth模块实现的,具体操作方法如下:
DocumentRoot /data/web/apache/public/htdocs
AccessFileName . htaccess
AllOerride All
htpasswd – c /data/web/apache/secrects/.htpasswd 88998
其中,-c表示选项告诉htpasswd你想生成一个新的用户文件,/data/web/apache/secrects/ 是你想存放 .htpasswd 文件的目录,文件名称为 .htpasswd,88998 是在验证时所用到的用户名,敲如以上命令后,系统提示你输入密码,这个密码就是验证时所需要用到的密码,该密码在 .htpasswd 文件中是加密的。现在用more来查看 /data/web/apache/secrects/.htpasswd文件,可以看到其中有一行用户名和一串加密密码。
使用文本编辑器,在目录 phpMyAdmin (如果已经改名,就是新的目录名)下创建 .htaccess 文件,在文件中加入如下语句:
AuthName "用户验证"
AuthType Basic
AuthUserFile /data/web/apache/public/htdocs/phpMyAdmin/.htpasswd
require user 88998
保存所做操作后,再去看phpMyAdmin目录,将提示验证窗口,输入刚用 htpasswd 命令创建的用户名和密码,即可进入该目录。
修改 .htaccess 文件如下:
AuthType Basic
AuthUserFile /data/web/apache/public/htdocs/phpMyAdmin/.htpasswd
require user 88998
deny from all
allow from 202.100.222.80
MySQL数据库安全配置
total 40
drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin
drwxrwxr-x 3 root root 4096 Feb 27 20:07 include
drwxrwxr-x 2 root root 4096 Feb 27 20:07 info
drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib
drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec
drwxrwxr-x 3 root root 4096 Feb 27 20:07 man
drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test
drwxrwxr-x 3 root root 4096 Feb 27 20:07 share
drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench
drwx—— 4 mysql mysql 4096 Feb 27 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx—— 2 mysql mysql 4096 Feb 27 20:08 mysql
drwx—— 2 mysql mysql 4096 Feb 27 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw——- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD
-rw——- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI
-rw——- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm
-rw——- 1 mysql mysql 302 Feb 27 20:08 db.MYD
-rw——- 1 mysql mysql 3072 Feb 27 20:08 db.MYI
-rw——- 1 mysql mysql 8982 Feb 27 20:08 db.frm
-rw——- 1 mysql mysql 0 Feb 27 20:08 func.MYD
-rw——- 1 mysql mysql 1024 Feb 27 20:08 func.MYI
-rw——- 1 mysql mysql 8641 Feb 27 20:08 func.frm
-rw——- 1 mysql mysql 0 Feb 27 20:08 host.MYD
-rw——- 1 mysql mysql 1024 Feb 27 20:08 host.MYI
-rw——- 1 mysql mysql 8958 Feb 27 20:08 host.frm
-rw——- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD
-rw——- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI
-rw——- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm
-rw——- 1 mysql mysql 428 Feb 27 20:08 user.MYD
-rw——- 1 mysql mysql 2048 Feb 27 20:08 user.MYI
-rw——- 1 mysql mysql 9148 Feb 27 20:08 user.frm
shell>chmod -R go-rwx /usr/local/mysql/var
shell>/usr/local/mysql/bin/mysql -uroot -ptest
另外这两个文件我们也应该不让它记录我们的操作,以防万一。
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
外部网络安全
MySQL数据库安装好以后,Unix平台的user表是这样的:
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+———–+——+———-+————-+————+
| Host | User | Password | Select_priv | Grant_priv |
+———–+——+———-+————-+————+
| localhost | root | | Y | Y |
| redhat | root | | Y | Y |
| localhost | | | N | N |
| redhat | | | N | N |
+———–+——+———-+————-+————+
4 rows in set (0.00 sec)
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+———–+——+———-+————-+————+
| Host | User | Password | Select_priv | Grant_priv |
+———–+——+———-+————-+————+
| localhost | root | | Y | Y |
| % | root | | Y | Y |
| localhost | | | Y | Y |
| % | | | N | N |
+———–+——+———-+————-+————+
4 rows in set (0.00 sec)
shell>mysqladmin -uroot password test
mysql> use mysql;
mysql> update user set password=password(‘test’) where user=’root’;
mysql> flush privileges;
我们先来了解授权表的结构。
mysql> desc user;
+—————–+—————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+—————–+—————–+——+—–+———+——-+
| Host | char(60) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Password | char(16) binary | | | | |
| Select_priv | enum(‘N’,’Y’) | | | N | |
| Insert_priv | enum(‘N’,’Y’) | | | N | |
| Update_priv | enum(‘N’,’Y’) | | | N | |
| Delete_priv | enum(‘N’,’Y’) | | | N | |
| Create_priv | enum(‘N’,’Y’) | | | N | |
| Drop_priv | enum(‘N’,’Y’) | | | N | |
| Reload_priv | enum(‘N’,’Y’) | | | N | |
| Shutdown_priv | enum(‘N’,’Y’) | | | N | |
| Process_priv | enum(‘N’,’Y’) | | | N | |
| File_priv | enum(‘N’,’Y’) | | | N | |
| Grant_priv | enum(‘N’,’Y’) | | | N | |
| References_priv | enum(‘N’,’Y’) | | | N | |
| Index_priv | enum(‘N’,’Y’) | | | N | |
| Alter_priv | enum(‘N’,’Y’) | | | N | |
+—————–+—————–+——+—–+———+——-+
17 rows in set (0.01 sec)
权限说明:
+———–+————-+———————————————————————–+
| 权限指定符| 列名 |权限操作 |
+———–+————-+———————————————————————–+
| Select | Select_priv | 允许对表的访问,不对数据表进行访问的select语句不受影响,比如select 1+1|
+———–+————-+———————————————————————–+
| Insert | Insert_priv | 允许对表用insert语句进行写入操作。 |
+———–+————-+———————————————————————–+
| Update | Update_priv | 允许用update语句修改表中现有记录。 |
+———–+————-+———————————————————————–+
| Delete | Delete_priv | 允许用delete语句删除表中现有记录。 |
+———–+————-+———————————————————————–+
| Create | Create_priv | 允许建立新的数据库和表。 |
+———–+————-+———————————————————————–+
| Drop | Drop_priv | 允许删除现有的数据库和表。 |
+———–+————-+———————————————————————–+
| Index | Index_priv | 允许创建、修改或删除索引。 |
+———–+————-+———————————————————————–+
| Alter | Alter_priv | 允许用alter语句修改表结构。 |
+———–+————-+———————————————————————–+
| Grant | Grant_priv | 允许将自己拥有的权限授予其它用户,包括grant。 |
+———–+————-+———————————————————————–+
| Reload | Reload | 允许重载授权表,刷新服务器等命令。 |
+———–+————-+———————————————————————–+
| Shutdown | Shudown_priv| 允许用mysqladmin shutdown命令关闭MySQL服务器。该权限比较危险, |
| | | 不应该随便授予。 |
+———–+————-+———————————————————————–+
| Process | Process_priv| 允许查看和终止MySQL服务器正在运行的线程(进程)以及正在执行的查询语句 |
| | | ,包括执行修改密码的查询语句。该权限比较危险,不应该随便授予。 |
+———–+————-+———————————————————————–+
| File | File_priv | 允许从服务器上读全局可读文件和写文件。该权限比较危险,不应该随便授予。|
+———–+————-+———————————————————————–+
+—————–+—————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+—————–+—————–+——+—–+———+——-+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Select_priv | enum(‘N’,’Y’) | | | N | |
| Insert_priv | enum(‘N’,’Y’) | | | N | |
| Update_priv | enum(‘N’,’Y’) | | | N | |
| Delete_priv | enum(‘N’,’Y’) | | | N | |
| Create_priv | enum(‘N’,’Y’) | | | N | |
| Drop_priv | enum(‘N’,’Y’) | | | N | |
| Grant_priv | enum(‘N’,’Y’) | | | N | |
| References_priv | enum(‘N’,’Y’) | | | N | |
| Index_priv | enum(‘N’,’Y’) | | | N | |
| Alter_priv | enum(‘N’,’Y’) | | | N | |
+—————–+—————–+——+—–+———+——-+
13 rows in set (0.01 sec)
+—————–+—————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+—————–+—————–+——+—–+———+——-+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| Select_priv | enum(‘N’,’Y’) | | | N | |
| Insert_priv | enum(‘N’,’Y’) | | | N | |
| Update_priv | enum(‘N’,’Y’) | | | N | |
| Delete_priv | enum(‘N’,’Y’) | | | N | |
| Create_priv | enum(‘N’,’Y’) | | | N | |
| Drop_priv | enum(‘N’,’Y’) | | | N | |
| Grant_priv | enum(‘N’,’Y’) | | | N | |
| References_priv | enum(‘N’,’Y’) | | | N | |
| Index_priv | enum(‘N’,’Y’) | | | N | |
| Alter_priv | enum(‘N’,’Y’) | | | N | |
+—————–+—————–+——+—–+———+——-+
12 rows in set (0.01 sec)
+————-+—————————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+—————————–+——+—–+———+——-+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Table_name | char(60) binary | | PRI | | |
| Grantor | char(77) | | MUL | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Table_priv | set(‘Select’,’Insert’, | | | | |
| | ‘Update’,’Delete’,’Create’, | | | | |
| | ‘Drop’,’Grant’,’References’,| | | | |
| | ‘Index’,’Alter’) | | | | |
| Column_priv | set(‘Select’,’Insert’, | | | | |
| | ‘Update’,’References’) | | | | |
+————-+—————————–+——+—–+———+——-+
8 rows in set (0.01 sec)
+————-+————————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+————————+——+—–+———+——-+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Table_name | char(64) binary | | PRI | | |
| Column_name | char(64) binary | | PRI | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Column_priv | set(‘Select’,’Insert’, | | | | |
| | ‘Update’,’References’) | | | | |
+————-+————————+——+—–+———+——-+
7 rows in set (0.00 sec)
MySQL的访问控制分两个步骤:
b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。
授权表的user, db, host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
下面是user表的Host字段和User字段组合的一些例子:
+—————————–+——–+——————————————————–+
| Host值 | User值 | 匹配的连接 |
+—————————–+——–+——————————————————–+
| ‘x.y.z’ | ‘test’ | test用户只能从x.y.z连接数据库 |
+—————————–+——–+——————————————————–+
| ‘x.y.z’ | ” | 任何用户可以从x.y.z连接数据库 |
+—————————–+——–+——————————————————–+
| ‘%’ | ‘test’ | test用户可以从任意主机连接数据库 |
+—————————–+——–+——————————————————–+
| ” | ” | 任何用户可以从任意主机连接数据库 |
+—————————–+——–+——————————————————–+
| ‘%.y.z’ | ‘test’ | test用户可以从y.z域的任意主机连接数据库 |
+—————————–+——–+——————————————————–+
| ‘x.y.% ‘ | ‘test’ | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库|
+—————————–+——–+——————————————————–+
| ‘192.168.1.1’ | ‘test’ | test用户可以从IP地址为192.168.1.1的主机连接数据库 |
+—————————–+——–+——————————————————–+
| ‘192.168.1.% ‘ | ‘test’ | test用户可以从C类子网192.168.1中的任意主机连接数据库 |
+—————————–+——–+——————————————————–+
| ‘192.168.1.0/255.255.255.0’ | ‘test’ | 同上 |
+—————————–+——–+——————————————————–+
SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。
grant用于给增加用户和创建权限,revoke用于删除用户权限。
下面是一些用grant增加用户和创建权限的例子:
用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。
给用户创建权限还可以通过直接修改授权表:
mysql> flush privileges;
mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")
mysql> flush privileges;
要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant option子句,下面是用revoke删除用户权限的例子:
mysql> flush privileges;
对于数字字段,我们要使用查询语句:SELECT * FROM table WHERE ID=’234’,不要使用SELECT * FROM table WHERE ID=234这样的查询语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sql inject攻击,关于sql inject攻击请参考下面链接的文章:
http://www.ngssoftware.com/papers/advanced_sql_injection.pdf
a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。
b)修改URL参数带的%22 (‘"’), %23 (‘#’), 和 %27 (”’)。
c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。
d)检查用户提交的数据是否超过字段的长度。
e)不要给自己程序连接数据库的用户过多的访问权限。
a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP 4.0.3以后提供了基于MySQL C API的函数mysql_escape_string()。
a)检查查询字串是否用了mysql_escape_string() API调用。
a)检查查询字串是否用了escape和quote处理。
a)检查查询字串是否用了quote()方法。
a)检查查询字串是否用了PreparedStatement对象。
MySQL Manual(http://www.mysql.com/documentation/index.html)
晏子的MySQL管理员指南(http://clyan.hongnet.com/index.html)
Access Granted(http://www.devshed.com/Server_Side/MySQL/Access)
月薪多少能过上舒适的日子
南京:3780元 无锡:3200元 苏州:4300元 济南:3120元
太原:1980元 银川:1100元 昆明:2800元 贵州:1600元
南昌:1200元 福州:3380元 厦门:4100元 青岛:4000元
天津:3150元 成都:1900元 重庆:2250元 长沙:2480元
兰州:1500元 郑州:2880元 西宁:1000元 武汉:2680元
秦皇岛:2550元 石家庄:2300元 哈尔滨:1700元 长春:1500元
沈阳:2100元 合肥:1680元 常州:3380元 温州:5020元
大连:3000元 呼和浩特:1700元 乌鲁木齐:2100元 拉萨:900元
西安:2080元 南宁:1300元 海口:2600元 三亚:2360元
澳门:8900元 香港:18500元 台北:11500元
当一颗7.62mm口径的步枪子弹以850 米/ 秒的速度射穿人体之后,都会发生些什么?
首先他会在正面射入点皮肤上留下一个直径不到1 厘米的小口,而弹头在经过身体时形成的巨大力量会震伤脏器,然后以570 米/ 秒的速度穿出人体,震波形成的出弹伤口直径有可能达到12厘米以上!如果是打在头上,创口将更为可怕,它将掀飞你1/3 的头盖骨?当年美国总统约翰。肯尼迪就是以这样一种方式殉国的,在现场录影中你可以看到这一点。
然后呢?如果弹头恰好击穿了动脉,在心脏泵血83.3毫升/ 秒的强大压力下,血液可以喷射到10米以外的地方。如果是在房间里,清理现场则变得很麻烦,你要洗净墙壁、家具和天花板上所有的血迹和被弹头带出的一些脏器残渣。
在中弹倒地时,人体中约有4000毫升血液。在其后短短的几秒钟里,出血量很快达到1000毫升。一个几秒钟前还鲜艳活泼、充满思想的人,现在立即就濒临死亡,这是指女性。如果是男性,只要400 毫升就够了。这个概念你可以通过化学实验室里的量筒转化为感性经验。
失去知觉之后,身体肌肉松弛,也包括括约肌.受害人大小便失禁,这意味着除去血污之外,你还将被自己的排泄物弄脏。再之后人体开始变凉,那是因为室温(恒25°C )往往低于体温(恒36°C ),再加上肌肤是热的不良导体,所以原本健康弹性的人体最后摸起来竟象案板上明码标价的肉类食品。
死亡后尸体如果没有经过迅速处理,而是象游戏里那样被抛在一边,它不会自动变为一小滩血迹和几块红色POLYGON ,而是一直躺在那儿,并出现一些日常生活中难得一见的特征。
从视觉上,你感到恐惧。除去大量的血迹,你还将看到从创口渗流出的体液,溢出的内脏和外翻的黄色皮下脂肪。由于失血,死者皮肤呈青黄色,并且有一些褐色出血点。然后人体开始奇怪地浮肿膨胀,肤色渐渐变为深棕色,尤指热带地区死亡者。从嗅觉上,创口开始发出强烈的异味,开始它只是一种新鲜内脏的腥气,之后渐渐变为一种能刺伤脑神经的恶臭。伴随着这种视觉与听觉的交相辉映,一种昆虫开始在肥沃的尸体中产下自己白色的幼子……
另外如果穿防弹背心,子弹击中你后,仿佛一个8 磅的大锤重击你一下,你会向后猛倒,可能断几根肋骨,同时由于头部惯性,颈项薄弱,颈部神经被压折,你会晕过去。如果击中头盔,即使没击穿,头盔变形也会夹碎你的颅骨,或者折断颈项。
"我"亲眼看过56式60米距离击中人的大腿根部,进去一个小洞,连子弹带骨渣飞出来是一个碗那么大个洞,肌肉,血管全部一团糟,只好截肢了。
所以中了枪,决不会象电影那样,摸一下,没事儿