关于htmlenties的一些情况

来源:互联网 发布:人工智能的未来下载 编辑:程序博客网 时间:2024/05/20 14:19

源码:

<?php     //error_reporting(0);$link = mysqli_connect('localhost', 'root', 'root', 'test');if (!$link) {     die('Could not connect to MySQL: ' . mysqli_connect_error()); } $link->set_charset("utf8");function clean($str){    if(get_magic_quotes_gpc()){        $str=stripslashes($str);    }    return htmlentities($str, ENT_QUOTES);}$username = @clean((string)$_GET['username']);$password = @clean((string)$_GET['password']);$query='select * from user where username=\''.$username.'\' AND password=\''.$password.'\';';var_dump($query); //提示:htmlentities函数的效果可以通过右键查看网页源代码来看效果echo "<br />";$result=mysqli_query($link,$query);if(!$result || mysqli_num_rows($result) < 1){    die('Invalid password!');}$row = mysqli_fetch_assoc($result);echo "Hello ".$row['username']."</br>";echo "Your password is:".$row['password']."</br>";?>

首先看那个get_magic_quotes_gpc()函数,翻阅手册:

测试环境版本下magic_quotes_gpc就是关闭的了,所以我们输入的字符都会通过htmlentities转义后返回

由于源码在调用该函数时第二个参数设置为ENT_QUOTES,所以我们输入的引号和双引号都会被转义掉,无法进行引号闭合

这个时候也没有办法让这个函数转化成一个引号出来,这里就有点想不明白,以为是通过二次编码绕过去,然而事情并没有那么复杂

借鉴前人的经验,你会发现,该函数并没有对\进行过滤,所以只要把整个where条件进行闭合好了,如

这个时候SQL查询语句变成了select * from user where username='xxxxxxx' or 1;

不论前面where条件满不满足,or 1的话就相当于是select * from user;结果就会出来了

原创粉丝点击