IPAから「安全なSQLの呼び出し方」というドキュメントが公開された。 http://www.ipa.go.jp/security/vuln/press/201003_websecurity_sql.html 開発者にとって無駄がなく、何を実施すればよいのかがすぐにわかる。よいと思った。 このドキュメントには、SQLインジェクションについて、原理から説明されている。現実の開発では(特に最近は)、いかに安く構築するかが重要な課題であるため、単価のより安い開発者に、詳細設計や実装をお願いせざるを得ない状況が多い。もちろんコーディング規約などは作成するが、ルールを作成したところで、内容が理解できていなければ遵守は難しい(はなから守らないか、守り方を間違えるか)。そんな中、実装者に対する教育コンテンツとして活用できる。 また、このドキュメントには、MySQLにおけるプリペアドステートメントの実装の
安全なSQLの呼び出し方 非常に細かい所なんですが、Oracle + JDBC の場合は、文字列リテラルを使った式とプレースホルダを使った式が等価では無い場合があるので、プログラムを書き換える時には注意が必要です。 具体的な事例として java-houseでの例を紹介しておきます。 ではどうすればいいのか考えるというのがここでの話題です。 等価にならない条件ですが、これははっきりしていて、 テーブルの列が固定長文字列として宣言されている JDBCの標準のパラメータ設定用メソッド PreparedStatement#setString(int, String) でパラメータ値をセットしている Oracleの固定長文字列の比較の「末尾のスペースの有無の無視」が有効であることが前提となるような検索条件である という3つの条件を全て満たしている場合に限られます。 (http://java-hous
独立行政法人情報処理推進機構(以下、IPA)は3月18日、SQLインジェクション攻撃が継続していることから、Webアプリケーションの安全な実装方法を解説した資料「安全なSQLの呼び出し方」(全40ページ)を公開した。 近年、Webサイトを狙った攻撃が後を絶たない。IPAが公開しているSQLインジェクション検出ツール「iLogScanner」で、脆弱性対策情報データベース「JVN iPedia」のアクセスログを解析しても、全体の45%がSQLインジェクション攻撃、38%がディレクトリ・トラバーサル攻撃によるトラフィックなのだという。 中でもSQLインジェクションは深刻な被害が発生することから、今回、具体的な対策を解説した資料を制作。IPAのWebサイト上で公開した。 データベースと連動するWebアプリケーションの多くは、Webサイト利用者からの入力情報を基にデータベースへの命令文(SQL文)
次の例は、CONVERT 関数を使用して、現在の日付を特定の形式で表す方法を示しています。 SELECT CONVERT(char, GETDATE(), 100) AS [100] 戻り値: Aug 16 2000 11:50 AM ほとんど同じ方法で、データを文字列から日付値へ変換することもできます。 SELECT CONVERT(datetime, 'Aug 16 2000 11:50AM', 100) AS [100] 戻り値: 100 2000-08-16 11:50:00.000 スタイル 130 (クウェートまたはヒジュラ) の日付を char データ型に変換する場合、コード ページ 1256 を使用するアラビア語の照合順序に基づいて Unicode 変換を行わないと、データが壊れる可能性があります。たとえば、次の図は、char に変換された列と nchar に変換された列を
MySQLはとても気ぃつかい屋さんである。我々が投げる多少あいまいな指示も頑張って解釈し、なんとか文句を言わずに実行してみようと挑戦してみてくれる。 今日はそんなMySQLがケナゲに解釈してくれる自動変換について紹介しようと思う。この自動変換、ケナゲなMySQLの奥ゆかしさ故、出した指示と異なる動作をされたことに気がつかないことがある。ここで紹介する6つの自動変換をしっかり脳ミソにたたき込んでおけば、無用なトラブルにハマる時間も減るかもしれない。 1.[数値] 範囲外の数値は頭を押さえつけられる intやsmallint、bigintなどの数値型には、扱える範囲が決まっている。例えばint型なら最大21億ちょっとだ(unsignedの場合は43億弱)。これより大きい数字を登録するよう指示を出すとMySQLはどうするか。そう、頑張って入れられるところまで入れてくれるのである。「入れられるとこ
カテゴリ: PHP MySQLを正しく使用する為には、クライアント側で接続文字セットを指定することが必要だ。クライアントライブラリに含まれるmysql_real_escape_string()などの関数がコネクションの文字セットの設定を参照して処理を行うからだ。接続文字セットの既定の設定はLatin1(ISO-8859-1)であるため、正しく指定されていない場合、多バイト文字の2バイト目以降に含まれるメタ文字と同じバイト値がエスケープされてしまい、不要な文字が挿入されたりSQLの文法エラーなどの不具合が発生する。 必須な割にどうやって設定するのかがまとまっていないので、ひとまずまとめてみる。 グローバルなオプションファイルで指定する MySQLの設定は基本的にコマンドラインオプション経由で行うが、それらと同じ内容をmy.iniなどのオプションファイルから指定することもできる。グローバルなオ
Before After Oracle RDBMS 11gR2 - Solving a Sudoku using Recursive Subquery Factoringという海外の記事を見つけて、これはスゲーwwと思ったんだ。 で、Oracleなんかよりも自分が慣れ親しんだ PostgreSQL でも、8.4で再帰SQLが出来るようになったからやってみたい!ってことでやってみた。 Oracleスペシャルな関数とかが無かったりしたのでちょこちょこと直したけど基本は同じです*1。 こうして上手く動くと感動するわー。 WITH RECURSIVE x(s, ind) AS ( SELECT sud, position(' ' in sud) AS ind FROM (SELECT '53 7 6 195 98 6 8 6 34 8 3 17 2 6 6 28 419 5 8 79'::text
Copyright (c) 2017 Ministry of Economy,Trade and Industry. All Rights Reserved.
Copyright (c) 2017 Ministry of Economy,Trade and Industry. All Rights Reserved.
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
_quoteメソッドの数値データ対応を検証する このエントリでは、PerlのDBI、PHPのPDO、MDB2にて用意されているquoteメソッドが数値データをどのように扱えるかを検証しました。結論としてMDB2が合格、それ以外は不合格で、とくにDBD::mysqlを使用した場合、脆弱性といってもよいような結果となりました。 概要 DBI、PDO、MDB2は、いずれもデータベースアクセスを抽象化したモジュール(クラス)であり、汎用的な記述によりさまざまなデータベースを利用できるように工夫されています。これらモジュール(クラス)にはquoteというメソッドが用意されています。DBIのquoteメソッドの呼び出し例を示します。 my $dbh = DBI->connect('DBI:mysql:dbname:localhost', 'user', 'pass'); print $dbh->quo
PHPでデータベースにアクセスする方法のうち、今回はPDO(PHP Data Objects)によって行う方法を紹介します。PDOをサポートしているデータベース(DB)を用いると、接続の時にその種類を指定する以外は、PDOによって統一化された方法でアクセスすることができます。関数の場合は接続するデータベースの種類ごとに関数名が変わりますが、PDOでは多くの機能がPDOクラスに集約され、各DBごとに特化したメソッドや定数についてのみ、DBの種類に応じた名称がつけられています。 PDOを利用するための設定 PDOを利用できるようにするには、事前に確認しておかなくてはならないことがあります。 接続するDBに対応したPDO用のドライバが用意されているか ドライバとは、PDOによる接続を行うモジュールで、それぞれのDBMSごとに必要です。Oracle, PostgreSQLなど主なDBでは、あらかじ
先日,MySQL 5.0 および 4.1 に関してSQLインジェクションの危険性に対応するためにバージョンアップが行われた。 SQLインジェクションとは,入力されたデータにより意図せざるSQL文が実行されてしまうという攻撃である。データベースのデータを書き換えられたり,データが読み出されることにより情報が漏洩したりする恐れがある。セキュリティ・ホールというとWebサーバーやWebアプリケーション言語の専売特許だという印象があるが,データベースにも存在する。十分な注意が必要である。 以下,SQLインジェクションの原理と,MySQLに存在した問題の詳細とその対応について解説する。問題の発見から修正にいたるやりとりはWeb上で公開されており,誰がいつ問題を指摘し修正したのかもたどることができる。 mysqli_real_escape_string()関数によるSQLインジェクションの防止 プログ
補足 この記事は旧徳丸浩の日記からの転載です。元URL、アーカイブ、はてなブックマーク1、はてなブックマーク2。 備忘のため転載いたしますが、この記事は2009年9月24日に公開されたもので、当時の徳丸の考えを示すものを、基本的に内容を変更せずにそのまま転載するものです。 補足終わり このエントリでは、SQLにおいて「暗黙の型変換」を使うべきでない理由として、具体的な「ワナ」をいくつか紹介します。 数値項目に対するSQLインジェクション対策のまとめにて説明したように、RDBの数値型の列に対してSQLインジェクション対策をする方法として、以下の三種類が知られています。 バインド機構を用いる パラメータの数値としての妥当性確認を行う パラメータを文字列リテラルとしてエスケープする このうち、方法3を使うべきでない説明の補足です。具体的には、方法3には、「暗黙の型変換」が発生しますが、それが思わ
IBM Documentation.
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く