- ベストアンサー
WordPressの質問(q10197680)の続
DOM-based XSS に関するコードについて考えているのですが、関数の「巻き上げ」が可読性と保守性を損なうようで funcion について修正すべきか考えております。 関数宣言を関数式にして const 変数に代入する方法で修正してみたのですが問題はなさそうでしょうか? 57、62、109、212行目を変更いたしました。 ※関数宣言での巻き上げについて https://qiita.com/kerupani129/items/b2c3619856b048c13394 ※DOM-based XSSのシンクとして働く機能 https://gihyo.jp/dev/serial/01/javascript-security/0006 ※以前アドバイス頂いたコード ※元のコード function lengthCheck() { const left = this.dataset.maxlength - this.value.length; if (left >= 0) { this.nextElementSibling.innerHTML = 'あと<strong>' + left + '</strong>文字'; this.dataset.submit_disabled = this.value.length === 0; } else { this.nextElementSibling.innerHTML = '<strong>' + -left + '</strong>文字超過しています'; this.dataset.submit_disabled = true; } ↓ ※エスケープ処理 function escapeHTML(値) { _ var a = document.createElement('span'); _ a.textContent = 値; _ return a.innerHTML; } 要素.innerHTML = '<strong>' + escapeHTML(文字列) + '</strong>'; ※最新コード https://wandbox.org/permlink/ozofFRK7rkjCXV76
- みんなの回答 (19)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (18)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- dell_OK
- ベストアンサー率13% (743/5656)
- 1
- 2
関連するQ&A
- JavascriptでXSSの脆弱性対策を行いたい
JavascriptのXSS対策としてinnerHTMLでHTMLのエスケープ処理コードを書いてみたのですが、正しいのか分かりませんアドバイスお願い致します。 ※名前HTML <div class="msg_partial">あと<strong>50</strong>文字</div> ※コメントHTML <div class="msg_partial">あと<strong>500</strong>文字</div> ※該当コード <h2>名前<span class="required">※必須</span></h2> <input class="length_input" data-maxlength="<?php echo MAX_LENGTH::NAME; ?>" type="text" name="namae" id="name" placeholder="未入力の場合は、匿名で表示されます" value="<?php echo $namae; ?>"> <div class="msg_partial"></div> <h2>コメント<span class="required">※必須</span></h2> <textarea class="length_input" data-maxlength="<?php echo MAX_LENGTH::MESSAGE; ?>" name="message" id="message" placeholder="荒らし行為や誹謗中傷や著作権の侵害はご遠慮ください"><?php echo $message; ?></textarea> <div class="msg_partial"></div> ※エスケープ処理を追加 function lengthCheck() { const left = this.dataset.maxlength - this.value.length; if (left >= 0) { const a = document.querySelectorAll('msg_partial'); return a.innerHTML; this.nextElementSibling.innerHTML = '<strong>' + escapeHTML(left) + '</strong>文字'; this.dataset.submit_disabled = this.value.length === 0; } else { const b = document.querySelectorAll('msg_partial'); return b.innerHTML; this.nextElementSibling.innerHTML = '<strong>' + escapeHTML(-left) + '</strong>文字超過しています'; this.dataset.submit_disabled = true; }
- ベストアンサー
- JavaScript
- WordPressの質問(q10135525)の続
名前に50文字で文字数制限を設けたいのですが、メッセージの500文字の文字数制限のコードとまとめるべきでしょうか? ※現在のデザイン http://www.irasuto.cfbx.jp/%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%83%86%e3%82%b9%e3%83%88/ ※現在のコード https://wandbox.org/permlink/9nnn2wsXBXo9CgdG ※single-index.php const NAME_MAX_LENGTH = 50; ※single-input.php <div id="name_partial"></div> <script> const name_partial = document.getElementById('name_partial'); name.addEventListener('input', contactForm); contactForm(); function contactForm() { const contactsignature = <?php echo NAME_MAX_LENGTH; ?> ; const input = contactsignature - name.value.length; if (input >= 0) { name.innerHTML = 'あと<strong>' + input + '</strong>文字'; submit_button.disabled = name.value.length === 0; } else { name.innerHTML = '<strong class="err">' + -input + '</strong>文字超過しています'; submit_button.disabled = true; } } </script>
- ベストアンサー
- PHP
- strongタグについて
HTML等全く知識がなくテンプレートやパーツなどは全てコピペで作成してきました。 以下のstrongタグはSEO的に有効でしょうか? <ul> <li class="menu_len" onmouseover="this.className='menu_len_on'" onmouseout="this.className='menu_len'"><a href="#" id="myText" onmouseover="this.innerHTML='文字A'" onmouseout="this.innerHTML='<strong>文字B</strong>'">文字B</a> <ul> 上記のようにすると文字Bの大きさが変わらずに表示できました。 この方法でstrongタグはSEO対策的に有効でしょうか? 文字Bの大きさを変えずにstrongやh3タグを使用する方法をご教授お願いします。(できれば文字Aも) それと、同一ページにh3タグを20~30ほど使用したいのですが、違反等の問題はないでしょうか?
- ベストアンサー
- ブログ
- XSSを意図的に引き起こしたい
お世話になっています。 今回セキュリティ講座を開くことになり、 XSSについて講義をすることになったのですがちょっと困っているので質問させてください。 PHPを使ってフォームに入力した文字列をそのまま出力する、 というWebアプリを作りたいのですが、 入力に <script>alert("XSS");</script> と入力してもアラートが表示されません。 PHPによって生成されたソースを見てみると、 <script>alert(\"XSS");</script> と¥でエスケープされていました。 受講者に実際にjavascriptが動いてしまうということを実践させたいので、 なんとかalertを動かす方法は無いのでしょうか? よろしくお願いします。 (厳密にはXSSではなくスクリプトインサーションですが^^;) 以下、ソースコードです。(BODY部分のみ抜粋) <form action="test3.php" method="post"> 入力<input type="text" name="str"><br> <input type="submit" name="submit" value="表示"><br> <?php if($_POST['submit']) { $string = $_POST['str']; echo $string; } ?> 実行環境: windows XP wwwサーバ:apache2.2 PHP5.2.8 ブラウザ:firefox3
- ベストアンサー
- ネットワーク
- 文字列からある文字だけを抜き出したい
4桁と5桁の値が入っているフィールドのテーブルがあります。 やりたいことは、下三桁目に「-」を入れたいです。 例) 12345 5678 ↓ 123-45 56-78 以下のようなコードを作成しましたが、 LEFTとRIGHT関数がPostgreSQLでは使用できないようです。 WEBで調べてSUBSTRINGを使うのかなと思ったのですが、 どうすればいいかわかりません。 ******作成したコード*********** (LEFT(id,LENGTH(id)-2) || '-' || RIGHT (RTRIM(id), 2)) どうぞ宜しくお願い致します。
- ベストアンサー
- PostgreSQL
- C++ : cout << (数字) で実行時エラーが発生する理由
ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。 具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。 受け取った文字列を逆順にする関数です。 ---------------------------------------------------------- void rev_str(char *a) { int length = 0; cout << length; // ここでエラーが発生 while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } --------------------------------------------------------- エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。 このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。 この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。 コード全体はこの下に掲載します。 cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。 全コード ------------------------------------------------------ #include <iostream> #include <cstring> using namespace std; void rev_str(char *a); void rev_str(const char *source, char *des); int main() { char a[80], b[80]; strcpy(a, "hello, world!"); rev_str(a, b); rev_str(a); cout << a << "\n"; cout << b << "\n"; return 0; } void rev_str(char *a) { int length = 0; cout << length; while(true) { if(*(a + length) == '\0') break; length++; } for(int i = 0; i < length / 2; i++) { char temp = a[i]; a[i] = a[length - i - 1]; a[length - i - 1] = temp; } } void rev_str(const char *source, char *des) { char *a = (char*)malloc(sizeof(source)); strcpy(a, source); rev_str(a); strcpy(des, a); free(a); }
- ベストアンサー
- C・C++・C#
- コンパイルエラー。間違ってるのは誰?(どこ?)
Effective C++の「型変換をさせたいなら、メンバでない関数をクラステンプレートの中で定義しよう」という項目に乗っていたコードを実験してみたのですが、コンパイルでエラーが出るようです。 ----- template<typename T> class Rational { T numerator_value; T denominator_value; public: Rational(const T& num=0, const T& den=1) :numerator_value(num), denominator_value(den){} const T numerator(){return numerator_value;} const T denominator(){return denominator_value;} void show() const { std::cout<<"numerator="<<numerator_value<<": denominator="<<denominator_value<<std::endl; } friend const Rational operator*(const Rational& lhs, const Rational& rhs) //←引数がおかしい? { return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator()); } }; int main() { Rational<int> obj1(1,10); Rational<int> obj2; obj2=obj1*10; obj2.show(); return 0; } ----- こういうコードを書いたのですが、friend関数の部分で「'const Rational<T>' から 'Rational<T> &' へ 'this' ポインタを変換できません」等と怒られます。 引数に取る二つの値のどちらもおかしいようで、コンパイルのエラーを出さないようにするためには、constと&を外さないといけないようです。 引数はEffectiveC++の掲載コードをそのまま使っています。 これは、私のコードがおかしいのか、本のコードがおかしいのかどちらでしょうか?
- ベストアンサー
- C・C++・C#
- Excelセル内の改行を含む文字列の1行目抽出
Excelセル内の改行を含む文字列があり、関数を使って、その1行目だけ抽出したい。 たとえば、下記のような式を書きました。「改行コード」おかしみたいで動作しません。 Left("A1", Find(vbCrLf, "A1")) (改行コードをさがして、そこまでの文字列を切り取る) これをVBAで書く方法があれば、コードを教えてください!
- ベストアンサー
- その他MS Office製品
- STDINについて
perl初心者です。よろしくお願いします。 <INPUT TYPE="password" NAME="pass" SIZE=12 MAXLENGTH=12> <INPUT TYPE="submit" VALUE="入室"> で入力されたパスワード(1234)を read(STDIN, $pass, $ENV{'CONTENT_LENGTH'}); print $pass;とすると、status=send&pass=1234とかえってきます。 これについて、$passの内容を1234にするには、 $pass=………;とするのでしょうが、この………部分の記述を どうすればよいのかわかりません。left関数は拒否されました。
- 締切済み
- Perl
- JavaScriptで入力制御&チェックをしたい
JavaScriptを使ってフォームの質問1の3を答えたら質問2が入力可能なるようにしたです。 name="q2"の形にすると制御できますが、phpでの受け取りが、最後にチェックされた値しか表示されないためname="q2[]"にしたいです。 しかし、name="q2[]"にした時のJS側の記述がわかりません。 name="q2[]"にするとphpの配列でチェックされた値全部を取得できるので、name="q2[]"の形でJSの 修正をしたいのですが、どのように記述すれがいいのでしょうか? なお、JSで難しい場合は、JSではなくPHPの修正でもかまいません。 結果、入力制御、入力チェックもでき、チェックボックスの値すべてがpostでphpに送れればいいです。 現状では下記のようにしています。 どうぞよろしくお願いいたします。 <form id="form1" name="form1" method="post" action="kakunin2.php" > <label for="q1">質問1</label> <p>今回のイベントはどうでしたか?</p> <p> <input type="radio" name="q1" value="よかった" onClick="changeDisabled()" />よかった <input type="radio" name="q1" value="普通" onClick="changeDisabled()" />普通 <input type="radio" name="q1" value="おもしろくなかった" onClick="changeDisabled()" />おもしろくなかった <br /><span id="q1_error" name="q1_error"></span> </p> <label for="q2">質問2</label> <p>質問1で「おもしろくなかった」とお答えの方に質問です。<br />おもしろくなかった理由は何ですか?</p> <p> <input type="checkbox" name="q2[]" value="退屈だった" disabled="disabled" />退屈だった <input type="checkbox" name="q2[]" value="時間が長かった" disabled="disabled" />時間が長かった <input type="checkbox" name="q2[]" value="時間が短すぎた" disabled="disabled" />時間が短すぎた <br /><span id="q2_error" name="q2_error"></span> </p> <input type="button" name="submit_01" id="submit_01" value="確認" onclick="check()"/> </form> ----------以下JavaScript---------- var frm = document.form1; var q1 = ""; var q2 = ""; var error_flag = ""; //質問1のチェック for(i = 0; i < frm.q1.length; i++){ if(frm.q1[i].checked){ q1 = frm.q1[i].value; } } if(q1 == "") { document.getElementById("q1_error").innerHTML = "質問1におこたえください"; error_flag = "1"; }else{ document.getElementById("q1_error").innerHTML = ""; } //質問2のチェック if(q1 == "おもしろくなかった" ) { for(j = 0; j < frm.q2.length; j++){ if(frm.q2[j].checked){ q2 = frm.q2[j].value; } } if(q2 == "") { document.getElementById("q2_error").innerHTML = "質問2におこたえください"; error_flag = "1"; }else{ document.getElementById("q2_error").innerHTML = ""; } }else{ document.getElementById("q2_error").innerHTML = ""; } if(error_flag !=""){ alert("入力が正しくありません!"); }else{ document.form1.submit(); } } //質問2のチェックボックスを使えるようにするかどうかを設定する function changeDisabled(){ //フォームのオブジェクトを入れておく var frm = document.form1; //質問1で「おもしろくなかった」を選ばれている場合に質問を入力できるようにする if(frm.q1[2].checked) { //チェックが入っていた場合の処理 for(i = 0; i < frm.q2.length; i++){ frm.q2[i].disabled = false; } }else{ //チェックが入っていなかった場合の処理 for(i = 0; i < frm.q2.length; i++){ frm.q2[i].disabled = true; } document.getElementById("q2_error").innerHTML = ""; } } ----------以下PHP(kakunin2.php)での受け取り---------- $q2 = $_POST["q2[]"]; for($i=0; $i<count($_POST["q2"]); $i++){ $q2[$i] = $_POST["q2"][$i] .","; echo $q2[$i]; }
- 締切済み
- JavaScript
お礼
質問の期限が切れておりました、申し訳ありません。 続きの質問を立てさせていただきました。アドバイスよろしくお願い致します。 https://okwave.jp/qa/q10217484.html
補足
回答ありがとうございます。 サイトを探して連続した改行コード・改行文字を取り除く方法を見つけたのですが、難しく理解できませんでした… 空白や改行を1行ずつにするにはどう書けばよいか分かりますでしょうか? ※正規表現を使い、連続した改行コード・改行文字を取り除く https://www.system-ido.com/risouken/index.php?page=tech&num=13 ※trimについて https://www.php.net/manual/ja/function.trim.php ※js 3連続以上の改行を2行の改行に変換する https://qiita.com/70ki8suda/items/42bd22376a90fc3d1c8e ※【PHP】文字列にある「改行」を削除する方法 https://renoji.com/IT.php?Contents=Program_PHP/String_Delete_LineBreak.html ※最新コード https://wandbox.org/permlink/tqhQfXgXIiiKhsOC