ホームページ >ウェブフロントエンド >jsチュートリアル >Node+mysqlのSQLインジェクションを解説した記事

Node+mysqlのSQLインジェクションを解説した記事

青灯夜游
青灯夜游転載
2022-11-14 20:10:371925ブラウズ

Node+mysqlのSQLインジェクションを解説した記事

バックエンドの開発に native NodeJS を直接使用することはありませんが、SQL インジェクション を理解する必要があります。

この記事では、NodeJS MySQL を使用して SQL インジェクションについて説明します。

SQL インジェクション攻撃は非常に古い攻撃手法であり、web2.0 の誕生以来、SQL インジェクション攻撃は存在しています。通常、入力ボックステキスト フィールドなどのフロントエンド コンポーネントに表示されます。入力内容に SQL ステートメント を追加し、一緒にバックグラウンドに渡します。 [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル ]

バックグラウンドが注意しないと、フロントエンドから渡された SQL ステートメント が独自のステートメントに接続されてしまいます。 SQL ステートメント、そして最終的に攻撃コードに接続されます。

したがって、予防策を講じる必要があり、そうしないと、データ漏洩が発生したり、データベースが削除されたりする可能性があります。

SQL インジェクションのデモ

ログインを例として、ユーザー名を保存するために MySQLusers テーブルを追加します。そしてパスワード。

users テーブルで、次のデータを作成しました。 insert into users (username, password, realname) names ('leihou' , '123 ', 'Thunder Monkey');

データの意味:

  • ユーザー名: 'leihou'
  • password: '123'
  • realname: 'Thunder Monkey'

この時点で、NodeJS 背景、ログインメソッドを作成しました

const mysql = require('mysql')

// 创建连接对象
const con = mysql.createConnection({
    host: 'localhost', // 地址
    user: 'root', // 连接数据库的用户
    password: '123456', // 连接数据库的密码
    port: '3306', // 默认端口
    database: 'testdb' // 数据库名
})

// 开始连接
con.connect()

// 统一执行 sql 的函数
function exec(sql) {
  const promise = new Promise((resolve, reject) => {
    con.query(sql, (err, result) => {
      if (err) {
        reject(err)
        return
      }
      resolve(result)
    })
  })
  return promise
}

// 登录方法
const login = (username, password) => {
  const sql = `
    select username, realname from users where username='${username}' and password='${password}';
  `

  console.log(sql)
  return exec(sql).then(rows => {
    return rows[0] || {}
  })
}

上記がログインメソッドです。

最後に、「NodeJS http リクエスト」 で説明した方法を使用して、フロントエンドへのインターフェイスを作成できます。インターフェースの部分はこの記事の焦点では​​ないので、ここでは省略します(怠惰にさせてください)。

この時点で、別の HTML ページを作成し、いくつかのコンテンツを大まかに生成してから、Ajax を使用してバックエンドに接続します。

面倒な場合は、postman Test

Node+mysqlのSQLインジェクションを解説した記事

##上記の

ログイン方法#に従って確認できます。 ## 、フロントエンドで次の内容を入力すると正常にログインできます

ユーザー名: leihou
  • パスワード: 123
  • ただし、今回入力したユーザー名は
leihou' --

です。-- の前後にスペースがあることに注意してください。そうすれば、パスワードを気軽に入力できます。 最後に結合された

SQL

ステートメントは、select username, realname from users where username='leihou' -- '、password='aslkfjsaf';## です。 # 何気なくパスワードを入力したことに注意してください。

MySQL

--

はコメントの意味を表します。したがって、上記のステートメントは ユーザー名が leihou であるデータをクエリします。当然、パスワードはバイパスされます。 上で入力した username の内容はログインを回避し、情報が漏洩します。しかし、誰かがあなたのテーブルを削除しようとした場合、その結果は非常に深刻になります。

たとえば、ユーザー名入力ボックスに「leihou'; ユーザーから削除; -- 」と入力します。

users テーブルは直接削除されました。

予防方法

SQL インジェクション攻撃 10 年以上前のものです。したがって、基本的な対処方法は成熟しています。

たとえば、フロントエンドから渡された文字列をトランスコードします。

NodeJS

の使用 ダウンロードした

MySQL

依存関係パッケージには、メソッド escape が用意されています。 <pre class="brush:js;toolbar:false;">// 省略部分代码 const mysql = require(&amp;#39;mysql&amp;#39;) // 省略创建连接对象 // 省略开始连接 // 统一执行 sql 的函数 exec 方法 const escape = mysql.escape const login = (username, password) =&gt; { username = escape(username) password = escape(password) const sql = ` select username, realname from users where username=${username} and password=${password}; ` console.log(sql) return exec(sql).then(rows =&gt; { return rows[0] || {} }) }</pre>escape メソッドを使用してフィルタリングされた文字列はエスケープされます。

このとき、ユーザー名に leihou' -- と入力すると、バックエンド コンソールに次の内容が出力されます。

select username, realname from users where username=&#39;leihou\&#39; -- &#39; and password=&#39;123345&#39;;

が表示されます。 leihou' に続く一重引用符はエスケープされます。

上記は、SQL インジェクション攻撃を防ぐための

MySQL

メソッドです。 ノード関連の知識の詳細については、nodejs チュートリアル を参照してください。

以上がNode+mysqlのSQLインジェクションを解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。