[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

徳丸浩の日記


2008年10月29日

_書籍「はじめてのPHPプログラミング基本編5.3対応」にSQLインジェクション脆弱性




id:hasegawayosukePHP5.3

PHP
目次から抜粋引用
07-07 Webアプリケーションのセキュリティ [セキュリティ]
08-04 データベースのセキュリティ [SQLインジェクション]
09-13 セキュリティ対策 [セキュリティ]



P280SQL(dbescape)
// SQLインジェクション対策用の関数
function dbescape($sql, array $params)
{
    foreach ($params as $param) {
        // パラメータの型によって埋め込み型を変える
        switch (gettype($param)) {
        case "integer":
        case "double":
            $replacement = $param;
            break;
        case "string":
            // 文字列の場合はエスケープ処理をおこなう
            $replacement = sprintf("'%s'", sqlite_escape_string($param));
            break;
        default:
            die("パラメータの型が正しくありません");
        }

        // SQLを置換し、パラメータを埋め込む
        $sql = substr_replace($sql, $replacement, strpos($sql, "?"), 1);
    }

    // すべてパラメータを埋め込んだSQLを返す
    return $sql;
}

SQLSQL
$sql = dbescape("SELECT COUNT(id) FROM friend WHERE from_name = ? AND to_name = ?",
                array($from_name, $to_name)); 

$from_name = "Johnson"$to_name = "M'Intosh" 
SELECT COUNT(id) FROM friend WHERE from_name = 'Johnson' AND to_name = 'M''Intosh'



($sql)調(?)調(?)

"?"SQL"?""?""?""AAA"
0:SELECT COUNT(id) FROM friend WHERE from_name = ? AND to_name = ?
                                                 ↑ '?' に置き換え
1:SELECT COUNT(id) FROM friend WHERE from_name = '?' AND to_name = ?
                                                  ↑ 'AAA' に置き換え
2:SELECT COUNT(id) FROM friend WHERE from_name = ''AAA'' AND to_name = ?

 '?' ?'AAA'"?"SQL


AAASQLSQL((=)(=))

AAASQLSQL"or 1=1--"SQL
SELECT COUNT(id) FROM friend WHERE from_name = ''or 1=1--'' AND to_name = ?

RDB(SQLite)--SQL--SQLSQLiteUNIONSQL




sql

PHPsqlite_xxxxPDOSQLite

SQLite使MySQL使MySQL()(CD-ROMMySQL)WindowsMySQLMySQLMySQLmysqliSQL

本日のリンク元
その他のリンク元
検索


[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

ockeghem(徳丸浩)の日記はこちら
HASHコンサルティング株式会社

最近の記事

最近のツッコミ

  1. りゅう (10-18)
Google