PHP 보안코딩 - Prepared Statements MYSQL 샘플 소스

Progmming/PHP|2019.02.13 15:35

Prepared Statements MYSQL 샘플 소스코드

기본적으로 보안을 위해 사용한다고만 알고있었으나 


w3schools 자료를 보면 Prepared Statements 는 3가지 장점을 갖습니다.


  1. 준비된 명령문은 쿼리 준비가 한 번만 수행되므로 구문 분석 시간을 줄입니다 (명령문이 여러 번 실행 되더라도)

  2. 바인딩 된 매개 변수는 전체 쿼리가 아닌 매번 매개 변수 만 보내야하므로 서버 대역폭을 최소화합니다.

  3. Prepared statements는 나중에 다른 프로토콜을 사용하여 전송되는 매개 변수 값이 올바르게 이스케이프 될 필요가 없으므로 SQL injection에 매우 유용합니다. 원래 명령문 템플리트가 외부 입력에서 파생되지 않으면 SQL 삽입이 발생할 수 없습니다.
$dbconn = new mysqli("디비 주소", "아이디", "비번", "디비명");

if ($dbconn->connect_errno) {
    echo "Failed to connect to MySQL: (" . $dbconn->connect_errno . ") " . $dbconn->connect_error;
}

if (!$dbconn->query("DROP TABLE IF EXISTS test") ||
    !$dbconn->query("CREATE TABLE test(id INT, label CHAR(1))") ||
    !$dbconn->query("INSERT INTO test(id, label) VALUES (1, 'a')")) {
    echo "Table creation failed: (" . $dbconn->errno . ") " . $dbconn->error;
}


$stmt = $dbconn->prepare("select a,b,c from tbl where a like CONCAT('%',?,'%') ");
$id = "abc";

$stmt->bind_param('s', $id);
$stmt->execute();

$stmt->bind_result($a, $b, $c);


//$stmt->fetch();  

while ($stmt->fetch()) {
	echo $a ."//".$b."//".$c;
}


$stmt->close();
$dbconn->close();



참고 사이트 : 

https://www.w3schools.com

http://php.net

https://stackoverflow.com

https://ko.wikipedia.org

태그 : mysql, php, prepared, sql, 보안

댓글()

PHP + Google Translate API 연동하기

Progmming/PHP|2018.05.04 13:19

PHP + Google Translate API 연동하기



Google translate document site

https://cloud.google.com/translate/docs/?hl=ko



Google 에서 제공되는 샘플 소스

https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/translate


 

하지만 그냥 최소한의 코딩으로 처리를 하고자 했기 때문에..


php 함수를하나 만듬.


function translate($content) { $handle = curl_init(); curl_setopt($handle, CURLOPT_URL,'https://www.googleapis.com/language/translate/v2'); curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); $data = array('key' => "API Key", 'q' => $content, 'source' => "ko", 'target' => "en"); curl_setopt($handle, CURLOPT_POSTFIELDS, preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', http_build_query($data))); curl_setopt($handle,CURLOPT_HTTPHEADER,array('X-HTTP-Method-Override: GET')); $response = curl_exec($handle); $responseDecoded = json_decode($response, true); $responseCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); curl_close($handle); return $responseDecoded['data']['translations'][0]['translatedText']; }


사용을 위해 신용카드 등록이 필요하지만 처음 등록 할 경우 300달러가 제공되니 참고해주세요.

댓글()

php 쿼리결과에 대한 결과 행이 있는지 여부, sqlsrv_has_rows / sqlsrv_num_rows

Progmming/PHP|2018.04.26 11:02

mysql 을 오랜만에 사용할 기회가 있어서 처리중에...


데이터 갯수를 체크해야 했는데 mssql 에서 하던대로 count 해서 데이터 갯수를 체크하려고 했으나


sqlsrv_num_rows 함수를 이용하니 결과 값이 빈값이 찍히는 상황.


확인해보니 sqlsrv_num_rows 결과 값을 리턴 받기 위해서는 커서 타입을 지정해야함.


단순 쿼리 결과 값이 있는지 여부를 체크하는 함수가 있더라는..



sqlsrv_has_rows 


- 쿼리결과에 대한 결과 행이 있는지 여부 .  return : bool


php manual : http://php.net/manual/en/function.sqlsrv-has-rows.php


<?php


    $server 
"serverName\sqlexpress";
    $connectionInfo = array( "Database"=>"dbName""UID"=>"username""PWD"=>"password" )
    $conn sqlsrv_connect$server$connectionInfo );

    $stmt sqlsrv_query$conn"SELECT * FROM Table_1");

    if (
$stmt) {
       
$rows sqlsrv_has_rows$stmt );
       if (
$rows === true)
          echo 
"There are rows. <br />";
       else 
          echo 
"There are no rows. <br />";
    }
?>




sqlsrv_num_rows

- 쿼리 결과에 대한 행의 갯수 .  
커서 타입을 SQLSRV_CURSOR_KEYSET 또는  SQLSRV_CURSOR_STATIC 으로  
지정해주어야 결과 값을 가져올 수 있음.


<?php
    $server 
"serverName\sqlexpress";
    $connectionInfo = array( "Database"=>"dbName""UID"=>"username""PWD"=>"password" );
    $conn sqlsrv_connect$server$connectionInfo );

    $sql "SELECT * FROM Table_1";
    $params = array();
    $options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
    $stmt sqlsrv_query$conn$sql $params$options );

    $row_count sqlsrv_num_rows$stmt );
   
    if (
$row_count === false)
       echo 
"Error in retrieveing row count.";
    else
       echo 
$row_count;
?>

댓글()