作者appleboy46 (小恶魔)
看板PHP
标题[讨论] 防止 SQL injection 方式
时间Thu Jun 26 16:30:26 2008
1F:推 wayway2004 :sql字串第一行多了where 06/24 17:32
2F:推 arrack :同楼上,把sql echo 出来 丢到MYSQL 执行 就知道哪 06/25 10:24
3F:→ KC73 :从一开始就要习惯, $_POST、$_GET 不要直接拿来用. 06/25 11:47
4F:→ ybite :楼上这句话很重要(SQL injection可是很恐怖的!) 06/25 16:05
5F:→ leoangela :谢谢大大指教,问题已解 06/25 19:15
6F:→ KC73 :希望你还有注意到 $_POST 和 $_GET 的问题. 06/25 22:47
针对回文的 SQL injection 方式讨论
我想这是现在网站最缺乏的东西了~ 网站安全已经是现在蛮热门的议题
我自己解决方法,就是 include 一段程式码在每一个 php 页面
这个作法我觉得相当不错,这是从 phpBB 的程式码节录的~ XD 我抄袭了 哈哈
code 如下:
if( !get_magic_quotes_gpc() )
{
if( is_array($_GET) )
{
while( list($k, $v) = each($_GET) )
{
if( is_array($_GET[$k]) )
{
while( list($k2, $v2) = each($_GET[$k]) )
{
$_GET[$k][$k2] = addslashes($v2);
}
@reset($_GET[$k]);
}
else
{
$_GET[$k] = addslashes($v);
}
}
@reset($_GET);
}
if( is_array($_POST) )
{
while( list($k, $v) = each($_POST) )
{
if( is_array($_POST[$k]) )
{
while( list($k2, $v2) = each($_POST[$k]) )
{
$_POST[$k][$k2] = addslashes($v2);
}
@reset($_POST[$k]);
}
else
{
$_POST[$k] = addslashes($v);
}
}
@reset($_POST);
}
if( is_array($_COOKIE) )
{
while( list($k, $v) = each($_COOKIE) )
{
if( is_array($_COOKIE[$k]) )
{
while( list($k2, $v2) = each($_COOKIE[$k]) )
{
$_COOKIE[$k][$k2] = addslashes($v2);
}
@reset($_COOKIE[$k]);
}
else
{
$_COOKIE[$k] = addslashes($v);
}
}
@reset($_COOKIE);
}
}
大家可以自己收下吧 ~ XD
这是我解决方式~ 大家讨论看看还有无其他方法
文章同步於我的 blog:
http://blog.wu-boy.com/2008/06/26/285/
--
感动了千万人的漫画
http://0rz.tw/b84cp
父母写给儿女的一封信
http://0rz.tw/354h7 爆笑msn图片
http://0rz.tw/ff4dS
你家的狗可以这样吗?
http://0rz.tw/f449H 超完美便当
http://0rz.tw/4f4j8
吊不完的车
http://0rz.tw/d34gf
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.107.20
7F:推 mosquito520 :推:) 06/26 18:11
8F:推 ileadu :最佳办法 直接打开 magic_quotes_gpc 06/26 19:19
9F:推 skywalking :Prepared Statements 的方式, 如下: 06/26 20:34
11F:推 chph :打开 magic_quotes_gpc 绝对是一个最烂方法 06/26 21:43
12F:→ chph :写PHP的我想没多少人喜欢用这个 06/26 21:45
13F:→ mizuiro :上面的程式不就是做打开magic_quotes_gpc的事吗? 06/26 23:22
14F:→ mizuiro :上面应该是要避免有人没开,没开的话就用自己写的来做 06/26 23:23
15F:→ arrack :不建议这样使用,还是乖乖自己写function 筛选吧 06/27 00:38
16F:推 GALINE :mysql_escape_string <- 这个呢?虽然只限MySQL使用 06/27 01:26
17F:→ KC73 :最佳办法是贴纸条在萤幕上「不直接用$_POST、$_GET」 06/27 02:32
18F:→ KC73 :刚开始起步, 就得养成注意这些事情的习惯.. 06/27 02:33
19F:推 liaosankai :if(!get_magic_quotes_gpc())←就是检查不存在的话 06/27 12:25
20F:→ liaosankai :才做自订的方法,这样做很ok呀,没什麽问题 06/27 12:26
21F:推 kylekai :请务必要用关闭 magic_quotes_gpc 的方法... 06/27 13:28
23F:推 JeffMcBride :原PO的方法在设计上要避免双反斜\\的结果 06/27 19:55
24F:→ JeffMcBride :一般在资料库存取前再处理即可防sql injection 06/27 19:57
25F:→ JeffMcBride :顾名思义嘛:p 06/27 19:57
26F:推 ileadu :五楼不想打开也没关系啊 请加原po这一段 完全跟打开 06/27 21:31
27F:→ ileadu :magic_quotes_gpc 做一样的事 这才叫最烂的方法吧? 06/27 21:31
28F:→ ileadu :还有请不要把自己的不喜欢 推到别人也不喜欢... 06/27 21:33
29F:推 ileadu :kylekai 的连结我看了 06/27 21:53
31F:→ ileadu :到那时会有更好的方法? 06/27 22:00
32F:推 ileadu :我再找些相关资料... PHP6 确定没有magic_quotes 06/27 22:07
33F:→ ileadu :而被移除的理由是 效能.. 因为不是输入都存到DB 06/27 22:08
35F:推 ileadu :而日後防止SQL injection 的方法 自己加addslashes 06/27 22:15
36F:→ ileadu :原po指的加在每一页 跟开magic_quote 没两样... 06/27 22:15
37F:→ ileadu :改成 放在要存到 DB 的处理页面即可 06/27 22:16
38F:→ ileadu :有输入栏位 又不存入db 还满少的 除了文字记录 :p 06/27 22:17