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注入

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

使用MySQL字符串运算实施精巧化SQL注入攻击

借用pnig0s的文章标题:使用MySQL字符串运算实施精巧化SQL注入攻击

但是内容讲解的更细致应该是
这篇文章:
在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
这里转载一下这篇文章非常有助于对MySQL的理解

web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密
码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证。对于LAMP架构的web应用而言,处理逻辑采用PHP,后台数据库采用MySQL。而在这一处理过程,由于种种处理不善,会导致不少严重的漏洞,除去弱口令与暴力破解,最常见的就是SQL注入。SQL注入可以在SQLNuke——mysql注入load_file
Fuzz工具
看到如何利用,而本篇博客的重点是利用MySQL隐形的类型转换绕过WAF的检测。

下面使用实例来展示这一过程。
实例包括2个脚本login.html与login.php,1张存放用户名与密码的member.user表

(1)表单login.html

<html>
<body>
<form id="form1" name="form1" method="post"action="login.php">
<label>UserName
<input name="user" type="text"id="user"/>
</label>
<br/>
<label>Password
<input name="password" type="text"id="password"/>
</label>
<br/>
<label>
<input name="login" type="submit" id="login"value="Login"/>
</label>
</body>
</html>

(2)认证处理login.php

<?php
if(isset($_POST["login"]))
{
$link = mysql_connect("localhost","root","toor") or die ("cannotconnect database".mysql_error());

mysql_select_db("member") or die ("cannot select the db");

$query = "select * from user where user='".$_POST["user"]."'andpassword='".md5($_POST["password"])."'";

echo $query."<br/>";

$result = mysql_query($query) or die ("the queryfailed:".mysql_error());
echo "<br/>";

$match_count = mysql_num_rows($result);

if($match_count){
while($row = mysql_fetch_assoc($result)){
echo "<strong>User:</strong>".$row["user"]."<br/>";
echo "<strong>Password:</strong>".$row["password"]."<br/>";
echo "<br/>";
}
}
else {

echo "Wrong User or password<br/>";

echo '<ahref="http://10.1.36.34/login.html">Back</a><br/>';
}

mysql_free_result($result);

mysql_close($link);
}
?>

注意:用户输入的用户名和密码,没有进行任何过滤就传入到数据库中去进行查询.该脚本将查询字符串及查询结果展示在页面中以供直观的演示SQL查询结果。

(3)member.user

大家看一张常见的用户表user表,由两个字段构成user用户名和password字段。

表中包含8行数据

很明显这是一段有SQL注入的程序,接下来我们来看看下面这些有趣的查询结果
(1) 输入用户名a’+'b#

查询结果如下图所示

(2)输入用户名45a’+'b’#

 产生以上结果的原因是算术操作符+的出现将字符型的user转换为了数值性的user
dani,tanjiti,dani123,0dani 对应的数值为0
123dani,123tanjiti对应的数值为123
45dani,045tanjiti对应的数值为45
'a'+'b'对应数值为0+0=0,会把类型转换后为0的用户名搜索出来
'45a'+'b'对应数值为45+0=45,会把类型转换后为45的用户名搜索出来
除了+号,其他算术操作符号也会发生类型的类型转换,例如MOD,DIV,*,/,%,-,

 (3)输入用户名a’MOD’1′#

 ’a'MOD’1′对应的数值为0 MOD 1=0,会把user对应数值为0的搜索出来

(4)输入用户名‘-”#

 ”-”对应的数值为0 -0 =0,会把user对应数值为0的搜索出来

bit操作符&,|,^,<<,>>也有同样的效果

(5)输入用户名‘/’1′#

”/’1′对应的数值为0 /1 =0,会把user对应数值为0的搜索出来

bit操作符&,|,^,<<,>>也有同样的效果

(6)输入用户名a’&’b'#

 ’a'&’b'对应的数值为0&0=0,会把user对应数值为0的搜索出来

对应WAF防火墙而言,当输入’ or 1=’1时,ModSecurity防火墙会报错(我没有试验过ModSecurity,博客中有介绍)

而上面的实例则可以绕过防火墙.
总的来说,利用MySQL隐性的类型转换来绕过WAF对SQL注入的检测是蛮有想法的。
参考:

http://vagosec.org/2013/04/mysql-implicit-type-conversion/


此文章通过 python 爬虫创建,原文是自己的csdn 地址: 使用MySQL字符串运算实施精巧化SQL注入攻击