8
2012
Ccenterにcaptcha_xを導入してみるテスト。
Ccenterにcaptcha_xを導入してみるテスト。 はコメントを受け付けていません
XOOPS Cubeには、様々なお問合せモジュールがありますが、
いざ使うとなるとどれを使って良いか迷ってしまいます。
これまではSPAM/SSL機能のついているFormMailモジュールを
愛用していたのですが、開発中止のモジュールなので、
そろそろ新しいモジュールにしようかと。
勉強会等に参加させて頂き、有識者の方々からのアドバイスを
参考にした結果、MySite Web Service様のCcenterモジュールが良いかな?
なんて思っているのですが、モジュール自体にはSSLや画像認証の機能がない。
SSLは以前に挙げたエントリの方法で対処するにしても、画像認証は
もう自分で組み込むしかないかな…という事で、Happy Linux様の
captcha_x for XOOPS をCcenterに組み込んでみました。
構築している環境によっていくつかパターンがあるので、
こちらで検証できた範囲で纏めてみます。
【注意事項】
PHPやJQueryをあまり良く解っていない自分が、ウンウン唸りながら
書いたものなので、コードに改良や修正の余地あれば、ご指摘ください。
また、本改造を行う場合は自己責任で行ってください。
【材料】
・captcha_x for XOOPS 0.14
・Ccenter 0.96
・jquery.js (XCL2.1系の場合)
【下ごしらえ】
captcha_x及びCcenterを予めインストールして
動くようにしておいてください。
【作り方】
・XCL2.2系(Pack2011にて検証)
1.captcha表示
修正ファイル:modules/ccenter/templates/ccenter_form.html
39~40行目辺りの
</table>
<p style="text-align: center;"><input type="submit" value="<{$smarty.const._MD_SUBMIT_CONF}>" <$form.submit_opts}> /></p>
…の間に下記コードを挿入(ハイライト部分)
</table>
<p style="text-align: center;">
<{php}>
include_once XOOPS_ROOT_PATH.'/modules/captcha/include/api.php';
$captcha_api =& captcha_api::getInstance();
$img_input = $captcha_api->make_img_input();
echo $img_input;
<{/php}>
</p>
<p style="text-align: center;"><input type="submit" value="<{$smarty.const._MD_SUBMIT_CONF}>" <$form.submit_opts}> /></p>
2.captchaチェック
以下のファイルを新規作成
作成ファイル:modules/ccenter/captcha_chk.php
<?php
include "../../mainfile.php";
include_once XOOPS_ROOT_PATH.'/modules/captcha/include/api.php';
$captcha_api =& captcha_api::getInstance();
$capapival = htmlspecialchars($_POST['captcha']);
if ($capapival == ""){
echo "認証コードが未入力です。";
} else {
if ( !$captcha_api->validate_post() ){
echo "認証コードが誤っています。";
}
}
?>
以下のファイルを修正
修正ファイル:modules/ccenter/templates/ccenter_form_widgets.html
87~108行目辺りのコード
function xoopsFormValidate_ccenter() {
var myform = window.document.ccenter;
var msg = "";
var obj = null;
<{foreach key=name item=val from=$item.checks}>
msg = msg+checkItem(myform["<{$name}>"], "<{$val.message|escape}>", "<{$val.pattern}>");
if(msg && obj==null)obj=myform['<{$name}>'];
<{/foreach}>
<{foreach key=name item=label from=$item.confirm}>
if ( myform.<{$name}>.value != myform.<{$name}>_conf.value ) {
msg = msg+"<{$label}>: <{$smarty.const._MD_CONFIRM_ERR}>\n";
if(obj==null)obj=myform.<{$name}>_conf;
}
<{/foreach}>
if (msg == "") return true;
window.alert(msg);
if (typeof(obj.length)!="number") obj.focus();
return false;
}
…を、下記のように書き換え(ハイライト部分)
function xoopsFormValidate_ccenter() {
var myform = window.document.ccenter;
var msg = "";
var obj = null;
<{foreach key=name item=val from=$item.checks}>
msg = msg+checkItem(myform["<{$name}>"], "<{$val.message|escape}>", "<{$val.pattern}>");
if(msg && obj==null)obj=myform['<{$name}>'];
<{/foreach}>
<{foreach key=name item=label from=$item.confirm}>
if ( myform.<{$name}>.value != myform.<{$name}>_conf.value ) {
msg = msg+"<{$label}>: <{$smarty.const._MD_CONFIRM_ERR}>\n";
if(obj==null)obj=myform.<{$name}>_conf;
}
<{/foreach}>
if (msg == ""){
var chkstat = "true";
} else {
var chkstat = "false";
}
var capobj;
var chkcap = function captchaCheck(val){
$.ajax({
async:false,
type: 'POST',
url: 'captcha_chk.php',
data: {"captcha":val},
contentType:"application/x-www-form-urlencoded;charset=UTF-8",
success: function(data) {
if (data != ""){
chkstat = "false";
capobj = "captcha";
msg = msg + data + "\n";
}
if (msg != ""){
window.alert(msg);
}
}
});
}
chkcap(myform.captcha.value);
if (capobj == "captcha"){
if(msg && obj==null)obj=myform.captcha;
}
if (chkstat == "true") return true;
if (typeof(obj.length)!="number") obj.focus();
return false;
}
・XCL2.1系で文字コードをEUC-JPで構築している場合(XCL2.1.7で検証)
1.captcha表示
XCL2.2系と同じなので割愛。
2.captchaチェック
以下のファイルを新規作成
作成ファイル:modules/ccenter/captcha_chk.php
<?php
include "../../mainfile.php";
include_once XOOPS_ROOT_PATH.'/modules/captcha/include/api.php';
$captcha_api =& captcha_api::getInstance();
$capapival = htmlspecialchars($_POST['captcha']);
if ($capapival == ""){
echo mb_convert_encoding("認証コードが未入力です。", "UTF-8", "EUC-JP");
} else {
if ( !$captcha_api->validate_post() ){
echo mb_convert_encoding("認証コードが誤っています。", "UTF-8", "EUC-JP");
}
}
?>
以下のファイルを修正
修正ファイル:modules/ccenter/templates/ccenter_form_widgets.html
87~108行目辺りのコード
function xoopsFormValidate_ccenter() {
var myform = window.document.ccenter;
var msg = "";
var obj = null;
<{foreach key=name item=val from=$item.checks}>
msg = msg+checkItem(myform["<{$name}>"], "<{$val.message|escape}>", "<{$val.pattern}>");
if(msg && obj==null)obj=myform['<{$name}>'];
<{/foreach}>
<{foreach key=name item=label from=$item.confirm}>
if ( myform.<{$name}>.value != myform.<{$name}>_conf.value ) {
msg = msg+"<{$label}>: <{$smarty.const._MD_CONFIRM_ERR}>\n";
if(obj==null)obj=myform.<{$name}>_conf;
}
<{/foreach}>
if (msg == "") return true;
window.alert(msg);
if (typeof(obj.length)!="number") obj.focus();
return false;
}
…を、下記のように書き換え(ハイライト部分)
※$.ajaxをjQuery.ajaxと記述している以外はXCL2.2系の場合と同じ。
function xoopsFormValidate_ccenter() {
var myform = window.document.ccenter;
var msg = "";
var obj = null;
<{foreach key=name item=val from=$item.checks}>
msg = msg+checkItem(myform["<{$name}>"], "<{$val.message|escape}>", "<{$val.pattern}>");
if(msg && obj==null)obj=myform['<{$name}>'];
<{/foreach}>
<{foreach key=name item=label from=$item.confirm}>
if ( myform.<{$name}>.value != myform.<{$name}>_conf.value ) {
msg = msg+"<{$label}>: <{$smarty.const._MD_CONFIRM_ERR}>\n";
if(obj==null)obj=myform.<{$name}>_conf;
}
<{/foreach}>
if (msg == ""){
var chkstat = "true";
} else {
var chkstat = "false";
}
var capobj;
var chkcap = function captchaCheck(val){
jQuery.ajax({
async:false,
type: 'POST',
url: 'captcha_chk.php',
data: {"captcha":val},
contentType:"application/x-www-form-urlencoded;charset=UTF-8",
success: function(data) {
if (data != ""){
chkstat = "false";
capobj = "captcha";
msg = msg + data + "\n";
}
if (msg != ""){
window.alert(msg);
}
}
});
}
chkcap(myform.captcha.value);
if (capobj == "captcha"){
if(msg && obj==null)obj=myform.captcha;
}
if (chkstat == "true") return true;
if (typeof(obj.length)!="number") obj.focus();
return false;
}
3.テーマファイル
使用するテーマのheadタグ内でJQueryを読み込んでください。
(例)テーマディレクトリ下に「js」というディレクトリを作って
「jquery.js」を置いた場合。
JQuery設置場所:/themes/[使用するテンプレートのディレクトリ]/js/jquery.js
修正ファイル:/themes/[使用するテンプレートのディレクトリ]/theme.html
<script type="text/javascript" src="<{$xoops_imageurl}>js/jquery.js"></script>
・XCL2.1系で文字コードをUTF-8で構築している場合(HD1.0.4で検証)
このパターンは、XCL2.2系とXCL2.1系・EUC-JPを混ぜた感じになります。
1.captcha表示
XCL2.2系と同じなので割愛。
2.captchaチェック
新規作成する「modules/ccenter/captcha_chk.php」は
XCL2.2系の場合と同じものを作ってください。
「modules/ccenter/templates/ccenter_form_widgets.html」
は、XCL2.1系・EUC-JPの場合と同じ修正を行ってください。
3.テーマファイル
XCL2.1系・EUC-JP同様、使用するテーマのheadタグ内で
JQueryを読み込んでください。
【謝辞】
各モジュールの作者様に、お礼申し上げます。
【追記】
下記FORUMで、本エントリのcaptchaを組み込んで脆弱性パッチがあたった
Ccenter0.97が入手できます。
》XUGJ – XCL2.2 スターターパックを作ってみました。
Similar Posts
- Ccenterへのcaptcha_x導入。[カスタムフォーム編]
- [RECIPE-NET] 最近更新されたBlog表示方法変更
- JQueryでのサイドバー開閉パネル。
- TOPへ戻るをpreloadにしてみるテスト。[XCL2.2系専用]
- [RECIPE-NET] XF-SECTION 印刷用ページ別窓表示
Related Posts
| 月 | 火 | 水 | 木 | 金 | 土 | 日 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||

次の記事
前の記事