黑帽联盟

 找回密码
 会员注册
查看: 1518|回复: 0
打印 上一主题 下一主题

[系统安全] PHP登录环节防止sql注入的方法浅析

[复制链接]

895

主题

38

听众

3329

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    难过
    昨天 22:31
  • 签到天数: 1652 天

    [LV.Master]伴坛终老

    在防止sql注入这些细节出现问题的一般是那些大意的程序员或者是新手程序员,他们由于没有对用户提交过来的数据进行一些必要的过滤,从而导致了给大家测试的时候一下就攻破了你的数据库,下面我们来简单的介绍一个用户登录未进行安全配置可能出现的sql注入方法,下面一起来看看吧。

    比如以下一段登录的代码:

    1. if($l = @mysql_connect('localhost', 'root', '123')) or die('数据库连接失败');
    2. mysql_select_db('test');
    3. mysql_set_charset('utf8');
    4. $sql = 'select * from test where username = "$username" and password = "$password"';
    5. $res = mysql_query($sql);
    6. if(mysql_num_rows($res)){
    7. header('Location:./home.php');
    8. }else{
    9. die('输入有误');
    10. }
    复制代码
    注意上面的sql语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面:
    1. $sql = 'select * from test where username = "***" and password = "***" or 1 = "1"';
    复制代码
    很明显,针对这条sql语句的万能密码是: ***" or 1 = "1
    1. $sql = 'select * from test where username ="***" union select * from users/* and password = "***"';
    复制代码

    正斜线* 表示后面的不执行,mysql支持union联合查询,因此直接查询出所有数据; 所以针对这条sql语句的万能用户名是:***" union select * from users/*

    但是,此注入只针对代码中的sql语句,如果

    1. $sql = "select * from test where username = $username and password = $password";
    复制代码
    上面的注入至少已经不管用了,不过方法是一样的;
    在使用PDO之后,sql注入完全可以被避免,而且在这个快速开发的时代,框架横行,已然不用过多考虑sql注入问题了。
    下面整理了两个防止sql注册函数
    1. /* 过滤所有GET过来变量 */
    2. foreach ($_GET as $get_key=>$get_var)
    3. {
    4. if (is_numeric($get_var)) {
    5. $get[strtolower($get_key)] = get_int($get_var);
    6. } else {
    7. $get[strtolower($get_key)] = get_str($get_var);
    8. }
    9. }
    10. /* 过滤所有POST过来的变量 */
    11. foreach ($_POST as $post_key=>$post_var)
    12. {
    13. if (is_numeric($post_var)) {
    14. $post[strtolower($post_key)] = get_int($post_var);
    15. } else {
    16. $post[strtolower($post_key)] = get_str($post_var);
    17. }
    18. }
    19. /* 过滤函数 */
    20. //整型过滤函数
    21. function get_int($number)
    22. {
    23. return intval($number);
    24. }
    25. //字符串型过滤函数
    26. function get_str($string)
    27. {
    28. if (!get_magic_quotes_gpc()) {
    29. return addslashes($string);
    30. }
    31. return $string;
    32. }
    复制代码
    另外还有一些博客会这样写
    1. <?php  
    2. function post_check($post)
    3. {
    4. if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开
    5. {
    6. $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
    7. }
    8. $post = str_replace("_", "\_", $post); // 把 '_'过滤掉
    9. $post = str_replace("%", "\%", $post); // 把' % '过滤掉
    10. $post = nl2br($post); // 回车转换
    11. $post= htmlspecialchars($post); // html标记转换
    12. return $post;
    13. }
    14. ?>
    复制代码
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部