Category Archives: mysql

PHP与SQL注入攻击

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。下面来谈谈SQL注入攻击是如何实现的,又如何防范。  看这个例子: // supposed input $name = “ilia’; DELETE FROM users;”; mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);  很明显最后数据库执行的命令是: SELECT * FROM users WHERE name=ilia; DELETE FROM users  这就给数据库带来了灾难性的后果–所有记录都被删除了。  不过如果你使用的数据库是MySQL,那么还好,mysql_query()函数不允许直接执行这样的操作(不能单行进行多个语句操作),所以你可以放心。如果你使用的数据库是SQLite或者PostgreSQL,支持这样的语句,那么就将面临灭顶之灾了。  上面提到,SQL注入主要是提交不安全的数据给数据库来达到攻击目的。为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加上反斜杠\。  但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。  许多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有一个叫mysql_real_escape_string()的函数,可将特殊字符和可能引起数据库操作出错的字符转义。  看这段代码: //如果Magic Quotes功用启用 if (get_magic_quotes_gpc()) { $name = stripslashes($name); }else{ $name = mysql_real_escape_string($name); } mysql_query(“SELECT * FROM users WHERE [...]

高并发网站系统架构

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系 统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技 术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能 比拟的。   大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。   上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

SQL语句如何进行模糊查找

LIKE条件一般用在指定搜索某字段的时候, 通过”% _” 通配符的作用实现模糊查找功能,通配符可以在前面也可以在后面或前后都有。 搜索以text开头: SELECT * FROM teble WHERE title LIKE ‘text%’ 搜索以text结束: SELECT * FROM teble WHERE title LIKE ‘%text’ 搜索包含text: SELECT * FROM teble WHERE title LIKE ‘%text%’ 注释:%表示0个或多个字符构成的字符串 _表示单个字符

如何解决MYSQL数据库中文乱码问题?

在数据库安的时候指定字符集 如果在安完了以后可以更改以下文件: C:\Program Files\MySQL\MySQL Server 5.0\my.ini 里的所有的 default-character-set=gbk C:\Program Files\MySQL\MySQL Server 5.0\data\depot_development\db.opt default-character-set=gbk default-collation=gbk_chinese_ci 建立数据库时候:指定字符集类型 CREATE DATABASE haichen CHARACTER SET ‘gbk’ COLLATE ‘gbk_chinese_ci’; 2.建表的时候 也指定字符集 CREATE TABLE student ( ID varchar(40) NOT NULL default ”, UserID varchar(40) NOT NULL default ”, ) ENGINE=InnoDB DEFAULT CHARSET=gbk; ————————————————————————————————————- 1。创建数据库的时候:CREATE DATABASE `database` CHARACTER SET ‘utf8′ COLLATE ‘utf8_general_ci’; 2.建表的时候 [...]

MYSQL常用的优化技巧

MySQL 自带 slow log 的分析工具 mysqldumpslow ,其用法是:slow log是 MySQL 根据 SQL 语句的执行时间设定,写入的一个文件,用于分析执行较慢的语句。 只要在 my.cnf 文件中配置好: log-slow-queries = [slow_query_log_filename] 即可记录超过默认的 10s 执行时间的 SQL 语句。 如果要修改默认设置,可以添加: long_query_time = 5 设定为 5s 。 如果要记录所有 SQL 语句,可以写入:log-long-format # t=time, l=lock time, r=rows # at, al, 以及 ar 是对应的平均值 mysqldumpslow 可以接受的参数有: ‘v+’, # verbose ‘d+’, # debug ’s=s’, # 排序 [...]

mysql有关权限的表都有哪几个?

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。 这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容: user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 db权限表:记录各个帐号在各个数据库上的操作权限。 table_priv权限表:记录数据表级的操作权限。 columns_priv权限表:记录数据列级的操作权限。 host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

如何处理大量数据并发操作

文件缓存,数据库缓存,优化sql,数据分流,数据库表的横向和纵向划分,优化代码结构! 锁述的概 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致 二 锁的分类 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。

mysql GROUP_CONCAT字符串相加函数

select GROUP_CONCAT(text) as count from tabletest GROUP BY goods_id; 例: id goods_id place 1 200 C1 2 200 C2 3 200 C3 集合字符( 如: C1 C2 C3 这样)

MySQL分区的两种形式及表分区

MySQL分区的两种形式 1,水平分区(Horizontal Partitioning) 2,垂直分区(Vertical Partitioning) 表分区类型 1,RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区 2,LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 3,HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。 4,KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 5,子分区是分区表中每个分区的再次分割。

sql 查询语句执行顺序

在SQL查询语句(Select Distinct… From … Join … On … Where … Group By … With … Having … Order By …)中,各个步骤是按什么先后顺序执行的? –执行顺序 1、FROM 2、on 3、join–做笛卡尔乘积 4、WHERE 5、group BY 6、with(cube | rollup ) 7、HAVING 8、select 列表 9、DISTINCT 10、order by