• ベストアンサー

SQL Injection対策はこれで十分?

データベースにMySQLを使用しています。SQL Injection対策を行いたいのですが、以下の方法で十分防ぐことができるのでしょうか? <?php $hoge = $_GET['ok']; $sql = "select * from ok where user = '".mysql_real_escape_string($hoge)."';"; $res = mysql_query($sql ....... ?> よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

injection対策としてはよろしいのではないですか? ユーザーデータのフォーマットがあるなら正規表現で はじくのをいれた方がベターかもしれませんね。 クッキーでカウントして、数度失敗すると 一定時間アクセスできないようにするとかいろいろ 対策はあるでしょう。 それとユーザーIDをGETで送らせるのは どうかとおもいますけど・・・ パスワードの設定もおわすれなく。

関連するQ&A

  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • SQLインジェクション対策

    SQLインジェクション対策で $hoge = htmlspecialchars($hoge); $hoge = mysql_real_escape_string($hoge); を使おうと思っていますが、どちらを先に書けばよいでしょうか?

    • 締切済み
    • PHP
  • SQLエラー

    検索システムの検索結果の分割をしようとしています。 しかしどうしてもSQL文にエラーがでてしまいます。 SELECT * FROM shops where (area='◯◯◯') ORDER BY id DESC limit0, 10 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit0, 10' at line 1 該当するSQL文は以下になります。 $query = "SELECT * FROM shops"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; }   $query .= "limit" . $page_num*10 . ", 10" ; limit句の使い方等間違いはないのかなと思うのですが、いかがでしょうか? アドバイスご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • これでSQLインジェクション対策できてますか??

    $search_query = "select SQL_CALC_FOUND_ROWS * from king"; $usersearch= mysql_real_escape_string($_GET['usersearch']); $clean_search = str_replace('、', ' ',$clean_search); $clean_search = str_replace(' ', ' ',$usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $pid = intval($_GET['pid']); if ($pid < 1) $pid = 1; $limit_start_rows = ( $pid - 1 ) * 10; $search_query .= " LIMIT {$limit_start_rows}, 10"; $result = mysql_query($search_query); $num_rows_result = mysql_query("SELECT FOUND_ROWS()"); $num_rows = mysql_fetch_assoc($num_rows_result); $num_rows = $num_rows['FOUND_ROWS()']; if($num_rows== 0){ $message="該当データは見つかりませんでした。"; } else $message=$num_rows ."件該当しました<br/>"; echo $message; while($row = mysql_fetch_array($result) 2行目でGETした文字をmysql_real_escape_string()で囲っただけですが大丈夫でしょうか。。

    • ベストアンサー
    • PHP
  • AJAXでGET出来ない(直接記載ならGET可)

    外部サーバー(192.168.1.5)から、データベース(192.168.1.6)の情報を取り出すことが可能なPHPを作っています。 問題点 $sqlのパスワードの部分を $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`='p3kchds243j5'"; というように、直接記載すれば問題なく外部サーバー(192.168.1.5)でデータベース(192.168.1.6)の情報をGETできますが、 $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd_e";や $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd2_e"; だと、なぜかGETすることができません。 同じ条件で指示しているはずなのですが、何が問題なのでしょうか? 尚、外部サーバーからのGET指示はnumber,userId,pwdでありここでの間違いはありません。 よろしくお願いいたします。 【データベース(192.168.1.6)のPHP】 <?php header('Access-Control-Allow-Origin: *'); require_once('/home/sql/login.php'); //外部サーバー(192.168.1.5)からGET送信されたデータを受け取る $number = $_GET['number']; $userId = $_GET['userId']; $pwd = $_GET['pwd']; $pwd2 = 'p3kchds243j5'; //GET送信されたデータをエスケープ $number_e = mysql_real_escape_string($number); $userId_e = mysql_real_escape_string($userId); $pwd_e = mysql_real_escape_string($pwd); $pwd2_e = mysql_real_escape_string($pwd2); mysql_set_charset('utf8'); $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd_e"; $result = mysql_query($sql); if (mysql_num_rows($result) > 0){ while($row = mysql_fetch_object($result)){ $string11 .= $row->a1; $string12 .= $row->userId; $string13 .= $row->pw; $string14 .= $row->nickname; } }else{ $string = "No matches!"; } //GET送信されてきたデータの確認 if($number == 9999){ //渡すデータを配列で格納 $array_data = array(string11=>$string11, string12=>$string12, string13=>$string13, string14=>$string14); } //ヘッダーの設定 header('Content-type:application/json; charset=utf8'); //渡すデータ(配列)をJSON形式にデコードして出力 echo json_encode($array_data); ?>

  • SQLインジェクションの対策

    SQLインジェクションの対策 いつもお世話になっております。 SQLインジェクションの対策についてお伺いいたします。 もともと↓のようなSQL文だったものを "select user_id from table where user_id='{$user_id}'" 以下のように変更しました。 "select user_id from table where user_id='" . mysql_real_escape_string($user_id) . "'" 以下のように実行されていたSQL文は select user_idfrom table where user_id='10001' and 'a'='a' ↓のようにエスケープ処理して実行されるようになりました。(入力値は「10001' and 'a'='a」) select user_id from table where user_id='10001\' and \'a\'=\'a' ですが、phpMyAdminで実行してみるとどちらのSQL文も同じ結果が取得できてしまいます。 これでは対策になっていないと思ったので、質問させていただきました。 (magic_quotes_gpcはoffに設定しています。) なにか他の方法がいいのでしょうか。 ご教示よろしくお願いいたします。 <環境> PHP 5.1.6 MySQL 5.0.45

    • ベストアンサー
    • PHP
  • mysql_real_escape_string

    独学数ヶ月の初心者の質問で恐縮です。 もろもろの事情で仕方なくmysql_real_escape_stringを 以下(1)のように使用しなくてはならないと仮定し、 セキュリテイの面で(2)のようにシングルクオテーションつける 事で危険を回避できますか? またシングルクオテーションは(2)のようにつけてはいけない とかありますか?(記述の基本が曖昧なため、ただの確認の質問) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", ’mysql_real_escape_string($id)’, ’mysql_real_escape_string($password)’); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 重複が

    新規登録の時の重複をチェックしたいです テーブルのカラムはシンプルにidとnameとpassだけです nameに同じ名前の人がいると困るので、HTMLフォームから送られた名前と登録してある名前の重複がないかチェックするようにできますか? やってみましたが動きません(ーー;; $name = mysql_real_escape_string($_POST['name']); $name3=array(); $name2 = mysql_query('SELECT name FROM hoge2 WHERE name=$name'); while($data = mysql_fetch_assoc($name2)) { array_push($name3, $data['name']); } if(isset($name3)){ print "重複があります"; }else{ //ここからsql $sql = sprintf('INSERT INTO hoge2 SET name="%s", pass="%s"', $name, mysql_real_escape_string($_POST['pass']) ); //ここまで mysql_query($sql) or die(mysql_error()); }

    • ベストアンサー
    • MySQL
  • html用とmysql用のエスケープ処理の両立方法

    一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

    • ベストアンサー
    • PHP
  • 複数の条件の検索

    会員の名前の更新するときに、会員以外の重複がないか調べたいです 会員以外のidと名前の一致を取得しようとしましたがうまくうごきません やりたいことは 会員以外の名前と入力した名前が重複してないか調べたいです $id = mysql_real_escape_string($_POST['id]); $name = mysql_real_escape_string($_POST['name']); $name3 = mysql_query("SELECT name FROM hoge2 WHERE NOT id='.$id.' AND name='".$name."'");

    • ベストアンサー
    • MySQL