<img id="img1" src="test.jpg" /> <canvas id="cvs1" ></canvas>
var cvs = $('#cvs1')[0]; var ctx = cvs.getContext('2d'); var img1=$("#img1")[0]; //座標(0,0)かつ原寸サイズでコピー ctx.drawImage(img1, 0, 0); //座標(50,80)の位置にコピー ctx.drawImage(img1, 50, 80); //画像幅を変えてコピー(100px × 100px) ctx.drawImage(img1, 0, 0,100,100);参考
<canvas id="cvs1" ></canvas>
var date = new Date(); var ms=date.getTime(); var img1=new Image();//イメージオブジェクトを生成 img1.src="img/temp.png?ms=" + ms;// 「?ms = ~」の役割はキャッシュから画像を表示させなくする。 //画像読込完了後にイメージオブジェクトをcanvas要素へ描画。 img1.onload=function(){ ctx.drawImage(img1, 0, 0); }
localStorage.setItem("key1","Hello world");ローカルストレージにデータをセットする。
var v=localStorage.getItem("key1");ローカルストレージから文字列を取り出す。
localStorage.removeItem("key1");ローカルストレージから指定キーに紐づく文字列を削除。
localStorage.clear();ローカルストレージ内のデータをクリア。
localStorage.length;ローカルストレージのデータ数。
localStorage.key(i);インデックス(連番)を指定してキーを取得することができる。
var url = location.href;
var url = location.href;
var url2 = url.split(/[?#]/)[0]; // URLからクエリ部分を除去する
var domain=location.href.split('/')[2];現在ページのURLが以下の場合、
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>プルダウンメニュー</title> <script src="jquery-1.11.1.min.js"></script> <style> .menu1 li{ list-style-type: none; float:left; width:50px; } .menu1 li ul li{ width:100px; position:relative; left:-40px; } .pulldown_menu ul{ display:none; position:absolute; width:180px; padding-bottom:10px; background-color:#484848; z-index:2; } .pulldown_menu ul a{ color:white; } </style> <script> $( function() { //~読込イベント処理~ //トップメニューのプルダウン $(".pulldown_menu").hover(function() { $(this).children('ul').show(); }, function() { $(this).children('ul').hide(); }); }); </script> </head> <body> <h1 >プルダウンメニュー</h1> <ul class="menu1"> <li>neko</li> <li>yagi</li> <li>kani</li> <li class="pulldown_menu"><a href="#"></a>same <ul > <li><a href="">シュモクザメ</a></li> <li><a href="">ホホジロザメ</a></li> <li><a href="">アオザメ</a></li> <li><a href="">ネコザメ</a></li> </ul> </li> </ul> <div style="clear:both"></div> </div> </body> </html>サンプル
function urlSanitize(str) { //記号「;<>"'」をサニタイズ str = str.replace(/;/g, ';'); str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); str = str.replace(/"/g, '"'); str = str.replace(/'/g, '''); //「http:」のコロンを除く、すべてコロンをサニタイズ str = str.replace('http:', 'http>'); str = str.replace('https:', 'https>'); str = str.replace(/:/g, ':'); str = str.replace('http>', 'http:'); str = str.replace('https>', 'https:'); return str; }
function test_run(){
var xssList=[
"https://example.com/?neko=1&yagi=2",
"http://example.com/\"onmouseover=\"alert(1)\"",
"http://example.com/?<script>alert('XSSテスト');</script>",
"javascript:alert('XSS')",
"jav ascript:alert('XSS');",
"color:expression(alert('XSS'));",
"behavior:url(test.sct)",
];
for(var i=0;i<xssList.length;i++){
var xss=xssList[i];
var url=urlSanitize(xss);
console.log(url);
}
}
/**
* URL用のサニタイズ
*/
function urlSanitize(str) {
//記号「;&<>"'」をサニタイズ
str = str.replace(/;/g, ';');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '"');
str = str.replace(/'/g, ''');
//「http:」のコロンを除く、すべてコロンをサニタイズ
str = str.replace('http:', 'http>');
str = str.replace('https:', 'https>');
str = str.replace(/:/g, ':');
str = str.replace('http>', 'http:');
str = str.replace('https>', 'https:');
return str;
}
/**
* 一般用のサニタイズ
*/
function sanitize_str(str) {
//記号「;&<>",」をサニタイズ
str = str.replace(/&/g, '&');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '"');
str = str.replace(/'/g, ''');
return str;
}
サニタイズ前のURL | サニタイズ後のURL |
---|---|
https://example.com/?neko=1&yagi=2 | https://example.com/?neko=1&yagi=2 |
http://example.com/"onmouseover="alert(1)" | http://example.com/"onmouseover="alert(1)" |
http://example.com/?<;script>;alert('XSSテスト');<;/script>; | http://example.com/?<script>alert('XSSテスト');</script> |
javascript:alert('XSS') | javascript:alert('XSS') |
jav ascript:alert('XSS'); | jav ascript:alert('XSS'); |
color:expression(alert('XSS')); | color:expression(alert('XSS')); |
behavior:url(test.sct) | behavior:url(test.sct) |
var objA={'neko':'猫','sakana':{'guppi':'グッピー','maguro':'マグロ'}};
delete objA.sakana;
別の記述方法
delete objA['sakana'];
/** * ファイル名から拡張子を取得する。 * @param string fn ファイル名 * @return string 拡張子 */ function _getExtension(fn){ if(fn==null || fn=='') return ''; if(fn.indexOf('.') == -1) return ''; let ary=fn.split("."); let ext=ary[ary.length-1]; ext = ext.toLowerCase();//小文字化する return ext; }
var fn="テスト.min.pdf"; var ext=getExtension(fn);//→ pdf
HTML
<input id="file1" type="file" name="file1" />
<input type="button" value="アップロード" onclick="upload1()" />
<div id="res"></div>
<div id="err"></div>
JavaScript
function upload1(){
var fd = new FormData();
fd.append( "fu_file1", $("#file1").prop("files")[0] );
$.ajax({
type: "POST",
url: "upload.php",
data: fd,
cache: false,
dataType: "text",
processData : false,
contentType : false,
})
.done(function(str_json, type) {
var data;
try{
data = JSON.parse(str_json);
}catch(e){
console.log(str_json);
jQuery('#err').html(str_json);
throw e;
}
console.log(data);
$('#res').html('success');
})
.fail(function(jqXHR, statusText, errorThrown) {
var err_res = jqXHR.responseText;
console.log(err_res);
jQuery('#err').html(err_res);
alert(statusText);
});
}
サーバー側(upload.php)
<?php
if($_SERVER['SERVER_NAME']=='localhost'){
// 一時ファイルをコピー
move_uploaded_file($_FILES["fu_file1"]["tmp_name"], 'xxx/'.$_FILES["fu_file1"]["name"]);
}
echo $_FILES["fu_file1"]["name"];
?>
HTML
<input id="file1" type="file" name="file1" multiple />
//ファイルアップロードイベント
$('#file1').change(function(e) {
var files = e.target.files;
var oFile = files[0];
// IEはファイル要素にnullが入っていてもチェンジイベントが発生するため対策する。
if(oFile==null){return;}
var reader = new FileReader();
reader.readAsDataURL(oFile);
//ファイル読込成功イベント
reader.onload = function(evt) {
var fd = new FormData();
fd.append( "upload_file", $("#file1").prop("files")[0] );
$.ajax({
type: "POST",
url: "upload.php",
data: fd,
cache: false,
dataType: "text",
processData : false,
contentType : false,
})
.done(function(str_json, type) {
var data;
try{
data = JSON.parse(str_json);
}catch(e){
console.log(str_json);
jQuery('#err').html(str_json);
throw e;
}
console.log(data);
$('#res').html('success');
})
.fail(function(jqXHR, statusText, errorThrown) {
var err_res = jqXHR.responseText;
console.log(err_res);
jQuery('#err').html(err_res);
alert(statusText);
});
}
});
PHP(upload.php)
<?php
// 一時ファイルをコピー
move_uploaded_file($_FILES["upload_file"]["tmp_name"],$_FILES["upload_file"]["name"]);
echo $_FILES["upload_file"]["name"];
?>
HTML
<input id="file1" type="file" name="file1" multiple />
<input id="file2" type="file" name="file2" multiple />
<input type="button" value="アップロード" onclick="upload1()" />
<div id="res"></div>
JavaScript
function upload1(){
var fd = new FormData();
fd.append( "fu_file1", $("#file1").prop("files")[0] );
fd.append( "fu_file2", $("#file2").prop("files")[0] );
$.ajax({
type: "POST",
url: "upload.php",
data: fd,
cache: false,
dataType: "text",
processData : false,
contentType : false,
})
.done(function(str_json, type) {
var data;
try{
data = JSON.parse(str_json);
}catch(e){
console.log(str_json);
jQuery('#err').html(str_json);
throw e;
}
console.log(data);
$('#res').html('success');
})
.fail(function(jqXHR, statusText, errorThrown) {
var err_res = jqXHR.responseText;
console.log(err_res);
jQuery('#err').html(err_res);
alert(statusText);
});
}
サーバー側(upload.php)
<?php
foreach($_FILES as $key=> $fileData){
if($_SERVER['SERVER_NAME']=='localhost'){
move_uploaded_file($fileData["tmp_name"], 'xxx/'.$fileData["name"]);
}
echo $fileData["name"] .'<br>';
}
?>
HTML
<input id="file1" type="file" name="file1" multiple />
<input type="button" value="アップロード" onclick="upload1()" />
JavaScript
function upload1(){
var fileElm = $("#file1");
var len = $("#file1").prop("files").length;
if(len==0){
return;
}
var fd = new FormData();
for (var i=0 ; i<len ; i++){
var key = 'fu_' + i;
fd.append( key, fileElm.prop("files")[i] );
}
$.ajax({
type: "POST",
url: "upload.php",
data: fd,
cache: false,
dataType: "text",
processData : false,
contentType : false,
})
.done(function(str_json, type) {
var data;
try{
data = JSON.parse(str_json);
}catch(e){
console.log(str_json);
jQuery('#err').html(str_json);
throw e;
}
console.log(data);
$('#res').html('success');
})
.fail(function(jqXHR, statusText, errorThrown) {
var err_res = jqXHR.responseText;
console.log(err_res);
jQuery('#err').html(err_res);
alert(statusText);
});
}
サーバー側(upload.php)
<?php
foreach($_FILES as $key=> $fileData){
if($_SERVER['SERVER_NAME']=='localhost'){
move_uploaded_file($fileData["tmp_name"], 'xxx/'.$fileData["name"]);
}
echo $fileData["name"] .'<br>';
}
?>
HTML
<input id="file1" type="file" name="file1" multiple />
<input type="text" id="animal_name" value="neko" />
<input type="button" value="アップロード" onclick="upload1()" /><br>
<div id="res"></div>
JavaScript
function upload1(){
var animal_name = $('#animal_name').val();
var fd = new FormData();
fd.append( "fu_file1", $("#file1").prop("files")[0] );
fd.append( "animal_name", animal_name );
$.ajax({
type: "POST",
url: "upload.php",
data: fd,
cache: false,
dataType: "text",
processData : false,
contentType : false,
})
.done(function(str_json, type) {
var data;
try{
data = JSON.parse(str_json);
}catch(e){
console.log(str_json);
jQuery('#err').html(str_json);
throw e;
}
console.log(data);
$('#res').html('success');
})
.fail(function(jqXHR, statusText, errorThrown) {
var err_res = jqXHR.responseText;
console.log(err_res);
jQuery('#err').html(err_res);
alert(statusText);
});
}
サーバー側(upload.php)
<?php
if($_SERVER['SERVER_NAME']=='localhost'){
move_uploaded_file($_FILES["fu_file1"]["tmp_name"], 'xxx/'.$_FILES["fu_file1"]["name"]);
}
echo $_FILES["fu_file1"]["name"].'<br>';
echo htmlspecialchars($_POST['animal_name'],ENT_QUOTES).'<br>';// XSSサニタイズしてから出力
?>
//拡張子によるファイル名バリデーション
function validByExt(files){
//許可拡張子マップ
var perExtMap={'doc':1,'docx':1,'xls':1,'xlsx':1,'xlsm':1,'ppt':1,'pptx':1,'pptm':1,'mdb':1,
'accdb':1,'txt':1,'jpg':1,'jpeg':1,'png':1,'bmp':1,'gif':1,'pdf':1,'epub':1,'book':1,
'zbf':1,'azw':1,'acsm':1,'xml':1,'mp3':1,'mpg':1,'mpeg':1,'vls':1,'csv':1,'wav':1,
'm4a':1,'tiff':1,'tif':1,'bpg':1,};
var errFns=[];//エラーファイル名リスト
for (var i = 0; i < files.length; i++) {
var file_name=files[i].name;//ファイル名を取得する
//ファイル名から拡張子を抜き出す。ついでに拡張子は小文字可する。
var ext=getExtension(file_name);
//許可拡張子マップに拡張子は存在しない場合
if(!perExtMap[ext]){
errFns.push(file_name);//ファイル名を不許可リストに追加する。
}
}
//retの初期化
var ret=null;
//不許可リストの件数が1件以上である場合。
if(errFns.length >= 1){
//エラーメッセージを組み立てて、retにセット
var str_fns=errFns.join('\n');
ret="以下のファイルはアップロード禁止です。\n" + str_fns;
}
return ret;
}
//ファイル名から拡張子を取得する。
function getExtension(fn){
if(fn==null){
return '';
}
var ary=fn.split(".");
var ext=ary[ary.length-1];
ext=ext.toLowerCase();//小文字化する
return ext;
}
$( function() {
$('#dad_area').bind('drop', function(e){
// デフォルトの挙動を停止
e.preventDefault();
// ファイル情報を取得
var files = e.originalEvent.dataTransfer.files;
//拡張子によるファイル名バリデーション
var err=validByExt_fudad(files);
if(err!=null){
alert(err);
return;
}
//ファイルアップロード
//uploadFiles(files);
}).bind('dragenter', function(){
// デフォルトの挙動を停止
return false;
}).bind('dragover', function(){
// デフォルトの挙動を停止
return false;
});
});
$( function() {
//ファイルアップロードボタンイベント
$('input[type="file"]').change(function(){
var files = this.files;
//拡張子によるファイル名バリデーション
var err=validByExt_fudad(files);
if(err!=null){
alert(err);
return;
}
//uploadFiles(files);//ファイルアップロード
});
});
/**
* XSSサニタイズ
*
* @note
* 「<」と「>」のみサニタイズする
*
* @param any data サニタイズ対象データ | 値および配列を指定
* @returns サニタイズ後のデータ
*/
function _xss_sanitize(data){
if(typeof data == 'object'){
for(var i in data){
data[i] = _xss_sanitize(data[i]);
}
return data;
}
else if(typeof data == 'string'){
return data.replace(/</g, '<').replace(/>/g, '>');
}
else{
return data;
}
}
/**
* XSSサニタイズ・デコード
*
* @note
* 「<」と「>」のサニタイズ化を元に戻す
*
* @param any data サニタイズ対象データ | 値および配列を指定
* @returns サニタイズ後のデータ
*/
function _xss_sanitize_decode(data){
if(typeof data == 'object'){
for(var i in data){
data[i] = _xss_sanitize_decode(data[i]);
}
return data;
}
else if(typeof data == 'string'){
return data.replace(/</g, '<').replace(/>/g, '>');
}
else{
return data;
}
}
旧:2017-1-5
XSSサニタイズするには、文字列中から以下のコードをサニタイズします。サニタイズ前 | サニタイズ後 |
---|---|
<; | < |
>; | > |
" | " |
' | ' |
//XSSサニタイズエンコード function xssSanitaizeEncode(str){ if(typeof str == 'string'){ return str.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, '''); }else{ return str; } } //XSSサニタイズデコード function xssSanitaizeDecode(str){ return str.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, '\'').replace(/'/g, '\''); }
//XSSインジェクションを引き起こす文字列のサンプル。マウスオーバーするだけでXSS攻撃されかねない。 var xss="<a href=\"http://example.com/\"onmouseover=\"alert('xss attack!')\"\">XSS Attack!!</a>"; $("#res1").html(xss); xss=xssSanitaizeEncode(xss);//XSSサニタイズエンコード $("#res2").html(xss); //エンコード後→<a href="http://example.com/"onmouseover="alert('xss attack!')"">XSS Attack!!</a> console.log(xss); //XSSサニタイズデコードでサニタイズ解除 xss=xssSanitaizeDecode(xss); $("#res3").html(xss);
<div id="res1"></div> <div id="res2"></div> <div id="res3"></div>参考
バージョン1
// 改行をBRタグに変換 function nl2br(str) { return str.replace(/[\n\r]/g, "<br>"); }
バージョン2
function nl2brEx(v){ v = v.replace(/[\n\r]/g, "<br>"); v = v.replace(/\\r?\\n/g, "\n"); v = v.replace(/\r?\n/g, "\n"); v = v.replace(/<br>\n/g,"\n"); v = v.replace(/\\n/g,'<br>'); return v; }
バージョン3
function nl2brEx(v){ if(v == null || v == '' || v=='0'){ return v; } v = v.replace(/\r\n|\n\r|\r|\n/g,'<br>'); return v; }