言い訳を言わせてくださいなの。
HTMLソースが見られたくないわけではありません。
HPに掲載している画像とかを悪用されるのを防止するためです。その悪用はコピーして使われることではなくて、画像直リンを使用して、匿名掲示板で使われることでもあったり。。。。
別にそれなら.htaccessで制御すればいいのでは?
究極のHTMLを見れなくする方法
実際にはこんなHTMLがご覧になることができるだけで、大して意味ないと思います。
具体的なコード
functions.php
<?php
if($_COOKIE["namae"] >= 1) {
} else {
header('Cache-Control: max-age=0');
header('Cache-Control: no-store, no-cache, must-revalidate' );
header('Cache-Control: post-check=0, pre-check=0', FALSE );
header('Pragma: no-cache');
if($_SERVER['HTTP_REFERER'] == "") {
$redirecturl=(empty($_SERVER["HTTPS"]) ? "http:$footerimgmargin/" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
echo <<<HTML
<!doctype html><html><head><meta http-equiv="refresh" content="0;URL=$redirecturl"></head></html>
HTML;
exit;
}
}
?>
仕組み
- キャッシュを完全に無効にすることで、今表示しているhtmlが消えています。
- HTTP_REFERERを確認して(リンク元はどこでも良い)、直接 view-source:http://url .. って入力されていないことを確認する
- もし、きちんとした閲覧ソフトであれば、refresh によってHTTP_REFERERが加えられ、正しく表示される。
- キャッシュが生きているサーバーでは使用できません。
- おまけとして、cookieに namae=1 が入っていると、正しいソースが表示されます。
問題点もあります。
- サイトがhttps運用でも、自家サーバーで オレオレSSL運用で https://localhost/ やその他名前でアクセスできるサーバーがある場合、そこからリンクすることで見れる場合があるかもしれません。
- ダウンロードツールで転送先のURLを追跡されたら、HTMLが見れてしまいます
- HTMLに最大2回程度の過剰アクセスが発生する
- HTTP_REFERERをブロックしている環境では無限ループが発生します。cookieを利用した対処法がよさそうです。
- ↑の対処を行うと、一部のブラウザで生のソースが見れてしまいます。
- そもそもHTMLソースを見れる専用アプリでは見れてしまうかも。
- そもそも、SEO悪くなるかもしれません
ということで、できたのは良いですが、SEOの問題で利用却下
残念ながら、下記のjQueryを拡張した上で、サイトポリシーに同意した上で、ソース表示を認めるという手段をとってみました。
それ以外の対処
- F12
- Ctrl + C、X、V、U
- Ctrl + Shift + C、I、J、K
- contextmenu copy paste drag drop
もブロックしておくべきです。
このブロックも同時に行っておかないと、結局ソースが表示されます。
jqueryblock.js
$(window).keydown(function(e){
if( e.ctrlKey &&
(
e.keyCode === 85 // Ctrl+U
|| e.keyCode === 67 // Ctrl+C
|| e.keyCode === 88 // Ctrl+X お問い合わせフォームがある場合除外したほうがよい
|| e.keyCode === 86 // Ctrl+V お問い合わせフォームがある場合除外したほうがよい
)
|| e.keyCode === 123 // F12
|| e.ctrlKey && e.shiftKey &&
(
e.keyCode === 73 // Ctrl+Shift+I
|| e.keyCode === 74 // Ctrl+Shift+J
|| e.keyCode === 75 // Ctrl+Shift+K
|| e.keyCode === 67 // Ctrl+Shift+C
)) {
return false;
}
});
$(document).bind("contextmenu copy paste drag drop", function() {
return false;
});
``