php 防止sql注入

标题起的名字很大其实这里只说一个简单的方法

防止Sql注入的方法有很多,这里要说的其实就是漏洞演练平台Dvwa里的一种方式

直接看high级别的就可以了

        $id = $_GET['id'];
	$id = stripslashes($id);
	$id = mysql_real_escape_string($id);

	if (is_numeric($id)){

		$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
		$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

		$num = mysql_numrows($result);

可见它的处理方式是首先通过 stripslashes 函数删除变量中的反斜杠 ,

然后再使用函数mysql_real_escape_string 转义特殊字符就行了。

所以当我们编写类似代码的时候

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

我们最简单的方法是
直接将变量$id 进行stripslashes 和 mysql_real_escape_string 处理。

注意: 这里并不是说这样就安全了, 这只是其中一种方式我可没说这就安全了。 更多的还要依据实际情况进行处理。

——来自自己的笔记

此文章通过 python 爬虫创建,原文是自己的csdn 地址: php 防止sql注入

SQL注入

SQL一些简单注入的整理
对于此文章最好不要复制粘贴因为有些符号使用中文的符号例如“;”有的也是英文的。

程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。

我们在这个地址后面加上单引号’如果返回错误则表示有可能存在注入。并且从返回信息中我们就可以获得一些信息、(为什么。。。。)
而有些程序员会把单引号过滤掉那么这样就不行了。
所以经典的1=1、1=2测试会更有效  (原因)

用and user>0 语句可以判断数据可类型。
如果不返回错误信息,那么可以用此方法:可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.***.com*.asp?id=1;exec master..xp_cmdshell “net username password /add”-- 
分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:
② http:/**.asp?id=1;exec master..xp_cmdshell “net localgroup nameadministrators/add”--  将新建的帐号name加入管理员组,这样你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。  
③ http:/**.asp?id=1 ;;anddb_name()>0
前面有个类似的例子and user>0,
作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。
④ http:/**.asp?id=1;backup database 数据库名 todisk=’c:inetpubwwwroot1.db’;--
这样可以从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!有时候不知道绝对路径就要用别的方法了,此方法成功率比较低。。。
⑤ http:/**.asp?id=1 ;;and (Select Top 1 name from sysobjects wherextype=’U’ andstatus>0)>0
sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ andstatus>0,表示用户建立的表名(好吧我没明白),上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。接着是第二个第三个。。。
⑥ http:/**.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1)from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个列名,将1换成2,3,4...就可以逐个获取所猜解表里面的列名。

绕过限制:
再有过滤敏感字符时可以绕过他如:
where xtype=’U’,字符U对应的ASCII码是85,所以可以用wherextype=char(85)代替;
如果字符是中文的,比如where name=’用户’,可以用wherename=nchar(29992)+nchar(25143)代替。

有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。

特别注意:地址栏的+号传入程序后解释为空格,+解释为+号,%解释为%号,具体可以参考URLEncode的相关介绍。

用Get(请求读取由URL所标识的信息)方法注入时,IIS会记录你所有的提交字符串,对Post(给服务器添加信息)方法做则不记录,所以能用Post的网址尽量不用Get。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: SQL注入

CentOS,Ubuntu,Gentoo,Freebsd,RedHat,Debian的区别及选择

CentOS,Ubuntu,Gentoo,Freebsd,RedHat,Debian的区别及选择

Linux最早由Linus Benedict Torvalds在1991年开始编写。在这之前,RichardStallman创建了Free SoftwareFoundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(此类程序的许可方式均为GPL: GeneralPublicLicense)。在不断的有杰出的程序员和开发者加入到GNU组织中后,便造就了今天我们所看到的Linux,或称GNU/Linux。

Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Redhat(RHEL)为代表,后者以Debian为代表。下面介绍一下各个发行版本的特点:

Redhat,应该称为Redhat系列,包括RHEL(Redhat Enterprise Linux,也就是所谓的RedhatAdvance Server,收费版本)、FedoraCore(由原来的Redhat桌面版本发展而来,免费版本)、CentOS(RHEL的社区克隆版本,免费)。Redhat应该说是在国内使用人群最多的Linux版本,甚至有人将Redhat等同于Linux,而有些老鸟更是只用这一个版本的Linux。所以这个版本的特点就是使用人群数量大,资料非常多,言下之意就是如果你有什么不明白的地方,很容易找到人来问,而且网上的一般Linux教程都是以Redhat为例来讲解的。Redhat系列的包管理方式采用的是基于RPM包的YUM包管理方式,包分发方式是编译好的二进制文件。稳定性方面RHEL和CentOS的稳定性非常好,适合于服务器使用,但是Fedora
Core的稳定性较差,最好只用于桌面应用。

Debian,或者称Debian系列,包括Debian和Ubuntu等。Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。Debian最早由Ian Murdock于1993年创建,分为三个版本分支(branch): stable,testing 和unstable。其中,unstable为最新的测试版本,其中包括最新的软件包,但是也有相对较多的bug,适合桌面用户。testing的版本都经过unstable中的测试,相对较为稳定,也支持了不少新技术(比如SMP等)。而stable一般只用于服务器,上面的软件包大部分都比较过时,但是稳定和安全性都非常的高。Debian最具特色的是apt-get
/dpkg包管理方式,其实Redhat的YUM也是在模仿Debian的APT方式,但在二进制文件发行方式中,APT应该是最好的了。Debian的资料也很丰富,有很多支持的社区,有问题求教也有地方可去:)

Ubuntu严格来说不能算一个独立的发行版本,Ubuntu是基于Debian的unstable版本加强而来,可以这么说,Ubuntu就是一个拥有Debian所有的优点,以及自己所加强的优点的近乎完美的Linux桌面系统。根据选择的桌面系统不同,有三个版本可供选择,基于Gnome的Ubuntu,基于KDE的Kubuntu以及基于Xfc的Xubuntu。特点是界面非常友好,容易上手,对硬件的支持非常全面,是最适合做桌面系统的Linux发行版本。

Gentoo,伟大的Gentoo是Linux世界最年轻的发行版本,正因为年轻,所以能吸取在她之前的所有发行版本的优点,这也是Gentoo被称为最完美的Linux发行版本的原因之一。Gentoo最初由DanielRobbins(FreeBSD的开发者之一)创建,首个稳定版本发布于2002年。由于开发者对FreeBSD的熟识,所以Gentoo拥有媲美FreeBSD的广受美誉的ports系统——Portage包管理系统。不同于APT和YUM等二进制文件分发的包管理系统,Portage是基于源代码分发的,必须编译后才能运行,对于大型软件而言比较慢,不过正因为所有软件都是在本地机器编译的,在经过各种定制的编译参数优化后,能将机器的硬件性能发挥到极致。Gentoo是所有Linux发行版本里安装最复杂的,但是又是安装完成后最便于管理的版本,也是在相同硬件环境下运行最快的版本。

最后,介绍一下FreeBSD,需要强调的是:FreeBSD并不是一个Linux系统!但FreeBSD与Linux的用户群有相当一部分是重合的,二者支持的硬件环境也比较一致,所采用的软件也比较类似,所以可以将FreeBSD视为一个Linux版本来比较。FreeBSD拥有两个分支:stable和current。顾名思义,stable是稳定版,而current则是添加了新技术的测试版。FreeBSD采用Ports包管理系统,与Gentoo类似,基于源代码分发,必须在本地机器编后后才能运行,但是Ports系统没有Portage系统使用简便,使用起来稍微复杂一些。FreeBSD的最大特点就是稳定和高效,是作为服务器操作系统的最佳选择,但对硬件的支持没有Linux完备,所以并不适合作为桌面系统。

下面给为选择一个Linux发行版本犯愁的朋友一些建议:
如果你只是需要一个桌面系统,而且既不想使用盗版,又不想花大量的钱购买商业软件,那么你就需要一款适合桌面使用的Linux发行版本了,如果你不想自己定制任何东西,不想在系统上浪费太多时间,那么很简单,你就根据自己的爱好在ubuntu、kubuntu以及xubuntu中选一款吧,三者的区别仅仅是桌面程序的不一样。
如果你需要一个桌面系统,而且还想非常灵活的定制自己的Linux系统,想让自己的机器跑得更欢,不介意在Linux系统安装方面浪费一点时间,那么你的唯一选择就是Gentoo,尽情享受Gentoo带来的自由快感吧!
如果你需要的是一个服务器系统,而且你已经非常厌烦各种Linux的配置,只是想要一个比较稳定的服务器系统而已,那么你最好的选择就是CentOS了,安装完成后,经过简单的配置就能提供非常稳定的服务了。
如果你需要的是一个坚如磐石的非常稳定的服务器系统,那么你的唯一选择就是FreeBSD。
如果你需要一个稳定的服务器系统,而且想深入摸索一下Linux的各个方面的知识,想自己定制许多内容,那么我推荐你使用Gentoo。

原文地址:http://blog.csdn.net/nightelve/article/details/7927195

此文章通过 python 爬虫创建,原文是自己的csdn 地址: CentOS,Ubuntu,Gentoo,Freebsd,RedHat,Debian的区别及选择

ruby 操作剪切板和gem install ffi 问题

最近有个问题需要解决 ,于是想到用ruby操作剪切板
但是 gem install clipboard 后 运行 写的程序提示需要安装
ffi.gem

于是又gem install ffi

提示出错:
ERROR:  Error installing ffi:
       invalid gem format forE:/bin/ruby/lib/ruby/gems/1.9.1/cache/ffi-1.7.0-x
86-mingw32.gem

后来经过查找终于解决了
解决办法:
1.下载DevKit
(cloud.github.com/downloads/oneclick/rubyinstaller/DevKit-tdm-32-4.5.2-20110712-1620-sfx.exe)
2.运行程序解压到相应目录比如C:Devkit
3.进入C:Devkit CMD下执行rbuy dk.rb init
4.没有问题继续执行rbuy dk.rb init init
5.最后执行 gem install rdiscount --platform=ruby即可

此文章通过 python 爬虫创建,原文是自己的csdn 地址: ruby 操作剪切板和gem install ffi 问题

Ruby autoload

autoload可以加载(注册)任何模块的类或常量,不能有::操作符的...
特别广泛应用在如下代码结构:

#rack.rb
#这样的文件结构ruby源码里随处可见
module Rack
  autoload :Builder, "rack/builder"
  autoload :Cascade, "rack/cascade"
  autoload :Chunked, "rack/chunked"
  autoload :CommonLogger,"rack/commonlogger"
  autoload :ConditionalGet,"rack/conditionalget"
  autoload :Config, "rack/config"
  ...
end
autoload本质是会调用Kernel.require,但是又和require有区别。
可以说autoload是一个smart的require...比require更加智能灵活。Just-in-Time..
几个简单的例子:

要被require的文件,mylibrary.rb

puts "I was loaded!"

class MyLibrary
end

require mylibrary时文件立即执行。

irb(main):001:0> require 'mylibrary'
I was loaded!
=> true

使用autoload,只有使用到需要的常量或类文件才被加载。。我们真正需要用某个文件时才加载,而require是直接加载,不管你是否会用到。

irb(main):001:0> autoload :MyLibrary, 'mylibrary'
=> nil
irb(main):002:0> MyLibrary.new
I was loaded!
=> #

转自:http://hooopo.iteye.com/blog/604975

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Ruby autoload