求大神指点:这段入库操作代码,是否安全,该怎样做到绝对安全呢?

叫我梁大侠 2015-05-23 11:14:50
我是这样写的:
$nql = "INSERT INTO `dh_member` (`email`,`tel`,`upass`,`unick`,`sri`,`sex`,`photo`,`add`,`sgao`,`xli`,`xlit`,`ysru`,`ysrid`,`sxiao`,`xzuo`,`zwjsao`,`hyzkuang`,`addip`,`addipt`,`mck`) VALUES ('". $email ."','". $tel ."','". mysqli_real_escape_string($upass) ."','". mysqli_real_escape_string($unick) ."','". $sri ."','". $sex ."','". $photo ."','". $add ."',". $sgao .",". $xli .",'". $xlit ."',". $yxin .",'". $yxint ."','". $sxiao ."','". $xzuo ."','". mysqli_real_escape_string($zwjsao) ."','". $hyzkuang ."','". getIPaddress() ."','". getIPS138(getIPaddress()) ."',". $site["examine"] .")";

这段入库代码,安全性怎么样,该怎么做到绝对安全呢?
我在网上查了些案例,有些是直接过滤验证是否含有SQL关键字等方式,但是那种方式太严苛了,有别的方式么
还有个小疑问,如果这样转义之后,那我查询输出的时候是否还需要在转义呢(网上说不用)?

...全文
108 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
果酱很好吃 2015-05-23
  • 打赏
  • 举报
回复
你说的是 magic_quotes_gpc 这个参数吧,若是为on 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes() 你可以用 get_magic_quotes_gpc() 来检测是否开启
Dleno 2015-05-23
  • 打赏
  • 举报
回复

if (!get_magic_quotes_gpc())
{
            $a   = addslashes($_GET['a']);
}
插入的值,不管是字符串还是数字,还是日期什么的,都可以用单引号包含起来

$sql="****id='{$id}',name='{$name}'*****";
因为你前面addslashes了变量的值,这样的话,不管变量的值是什么,它都逃不出你写的引号。。
xuzuning 2015-05-23
  • 打赏
  • 举报
回复
你这是拼装 SQL 指令,不存在安全问题 如果你不想把所谓不安全的内容放入数据库,那么请在这之间逐个变量检查 mysqli_real_escape_string 只是转义特殊字符 与 addslashes 的作用一样,只不过 mysql 函数库为库函数完备才增加了 mysqli_real_escape_string 当 magic_quotes_sybase 开启时,addslashes 将 ' 被转换成 '' 当 magic_quotes_sybase 关闭时,addslashes 将 ' 被转换成 \' 这是为了适应两大主流数据库的需要
叫我梁大侠 2015-05-23
  • 打赏
  • 举报
回复
引用 1 楼 jam00 的回复:
我是这样做限制的(结合网上一些例子) 最终执行的sql语句中包含: 'load_file','hex','substring','if','ord','char' 这些函数 'intooutfile','intodumpfile','(select' 这些动作 '/*','*/','#','--','"' 这些字符 都提示错误,当然这是针对用户输入生成的sql,若是自己写的sql,可以不做这些限制
谢谢啊 ,我看到有说 addslashes 使用这个前提是magic_quotes_sybase为OFF时,我查看服务器php.ini这个是开启的,那我就不需要做这个操作吧?
果酱很好吃 2015-05-23
  • 打赏
  • 举报
回复
我是这样做限制的(结合网上一些例子) 最终执行的sql语句中包含: 'load_file','hex','substring','if','ord','char' 这些函数 'intooutfile','intodumpfile','(select' 这些动作 '/*','*/','#','--','"' 这些字符 都提示错误,当然这是针对用户输入生成的sql,若是自己写的sql,可以不做这些限制
xuzuning 2015-05-23
  • 打赏
  • 举报
回复
首先在高版本的 php 中 magic_quotes_sybase 已经不存在了,也就没有必要讨论了 1、先看看为什么要转义 有这样一条 SQL 指令: insert into tbl_name (name) values ('the's') 就是向 name 字段插入一个单词 thi's 当这条指令传到数据库时,数据库将分不清楚,套红的那个分号表示的是字符串结束还是单词的一部分 这就是需要转义的原因:本来作为字符串定界符的单引号,现在只作为普通字符了 insert into tbl_name (name) values ('the\'s') 2、数据库怎么保存转义符的呢 答案是不保存 既然转义是为了帮助数据库理解指令的,那么理解了,转义符也就没有存在的必要了 于是如果你希望在正文中直线 \ 这个符号,那么在插入时也要转义 \\,以使 \ 失去转义的功能
Dleno 2015-05-23
  • 打赏
  • 举报
回复
我说的是引号,({}只是用来解析字符串中变量用的) $a = 'shi'; echo "wo$ashui!";#wo echo "wo{$a}shui!";#woshishui 你的语句前面都没什么问题。 后面: *******."',". $site["examine"] .")"; php解析出来比如: 你期望的: ******,'gtrytr',765465); 但这种你即使addslashes了$site["examine"] ;还是会存在注入漏洞。
叫我梁大侠 2015-05-23
  • 打赏
  • 举报
回复
谢谢三位大神的回答,只是我听得有点迷糊了...
引用 3 楼 xuzuning 的回复:
你这是拼装 SQL 指令,不存在安全问题 如果你不想把所谓不安全的内容放入数据库,那么请在这之间逐个变量检查 mysqli_real_escape_string 只是转义特殊字符 与 addslashes 的作用一样,只不过 mysql 函数库为库函数完备才增加了 mysqli_real_escape_string 当 magic_quotes_sybase 开启时,addslashes 将 ' 被转换成 '' 当 magic_quotes_sybase 关闭时,addslashes 将 ' 被转换成 \' 这是为了适应两大主流数据库的需要
$nql = "INSERT INTO `dh_member` (`email`,`tel`,`upass`,`unick`,`sri`,`sex`,`photo`,`add`,`sgao`,`xli`,`xlit`,`ysru`,`ysrid`,`sxiao`,`xzuo`,`zwjsao`,`hyzkuang`,`addip`,`addipt`,`mck`) VALUES ('". $email ."','". $tel ."','". mysqli_real_escape_string($upass) ."','". mysqli_real_escape_string($unick) ."','". $sri ."','". $sex ."','". $photo ."','". $add ."',". $sgao .",". $xli .",'". $xlit ."',". $yxin .",'". $yxint ."','". $sxiao ."','". $xzuo ."','". mysqli_real_escape_string($zwjsao) ."','". $hyzkuang ."','". getIPaddress() ."','". getIPS138(getIPaddress()) ."',". $site["examine"] .")"; 这是拼装 SQL 指令,不存在安全问题 意思是足够安全么? 与 addslashes 的作用一样,只不过 mysql 函数库为库函数完备才增加了 mysqli_real_escape_string ,我在网上看的说mysqli_real_escape_string是在入库的时候会转义,但是实际存到数据库中却不含转义符的,是这样么? 比如我有个注册登录页面,密码变量带有单双引号,(magic_quotes_sybase 开启了),注册时候: $sql = "INSERT INTO user (uname,upass) VALUES ('". $uname ."','". $upass ."')"; 判断登录的时候: $sql = "select * from user where uname='". $uname ."', upass='". $upass ."'"; 那如果magic_quotes_sybase 没有开启: $sql = "INSERT INTO user (uname,upass) VALUES ('". addslashes($uname) ."','". addslashes($upass) ."')"; 判断登录的时候: $sql = "select * from user where uname='". addslashes($uname) ."', upass='". addslashes($upass) ."'"; 是这样的道理么?
引用 4 楼 dingsongtao 的回复:

if (!get_magic_quotes_gpc())
{
            $a   = addslashes($_GET['a']);
}
插入的值,不管是字符串还是数字,还是日期什么的,都可以用单引号包含起来

$sql="****id='{$id}',name='{$name}'*****";
因为你前面addslashes了变量的值,这样的话,不管变量的值是什么,它都逃不出你写的引号。。
按你的是 用花括号 代替原来的“” ,安全性更高么?
引用 5 楼 jam00 的回复:
你说的是 magic_quotes_gpc 这个参数吧,若是为on 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes() 你可以用 get_magic_quotes_gpc() 来检测是否开启
谢谢啊 , 那意思就是为ON,就没必要(addslashes或mysqli_real_escape_string)转义了吧,是这样么? 我刚用PHP,可能问的有点弱智...见笑了

21,873

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧