2

私の onclick 関数は、1 つの変数を渡すと美しく機能し、2 つの変数を渡そうとすると応答しません。私の構文に何か問題がありますか?

このコードをサポートするものはすべてテストされ、正常に動作するので、コードの onclick 行の構文に何か問題があると確信しています。どんな助けでも素晴らしいでしょう。

------------onclick code---------------------------------------------------
    Response.Write "<td class=""alt""><input type=""button"" onclick=""deleteRecordAtt(" & AttID &","& StoredPath & " )"" value=""remove"" /></td></tr>"

-----------function reference code in main page---------------------------------------

function deleteRecordAtt(AttID, StoredPath){
if(confirm("This will delect the attachment path"))
{
document.location.href="delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+escape(document.location.href);
}
}
-----------function code in source page ----------------------------------------------

<%


Dim AttID, RedirectURL, StoredPath
Dim objConn

AttID=request("EMAIL_LETTERS_HOLD_ID")
RedirectURL=request("RedirURL")


Set objConn = CreateObject("ADODB.Connection")
objConn.Open "DSN=MyDSN"
objConn.Execute("UPDATE EMAIL_SEND_ATTACHMENTS set ATTACHMENTS = Replace(LTRIM(RTRIM(ATTACHMENTS)), '"& StoredPath & "' ,'') WHERE EMAIL_LETTERS_HOLD_ID= "& AttID & " ")
objConn.Close
Set objConn = Nothing

response.redirect RedirectURL
%>
4

2 に答える 2

3

onclick=""deleteRecordAtt(" & AttID &","& StoredPath & " )""

エスケープせずに文字列を連結することは、決して良い考えではありません。おそらく AttID は整数であるため、その 1 つの引数を使用できますが、StoredPath は文字列です。その文字列をエスケープまたはラップしていないため、上記の Write は次のような HTML コードになります (たとえば、「storedpath」がファイル名であると仮定します)。

onclick="deleteRecordAtt(123, file.gif)"

もちろん、引用符で囲まれていない「file.gif」は JavaScript として解析できません。構文エラーが発生します。ブラウザでスクリプト エラーが有効になっていることを確認してください。これにより、このような問題が発生したときに、黙って失敗するのではなく、それを確認できます。

単純な解決策は、ラッピング クォートを追加することです。

onclick=""deleteRecordAtt(" & AttID &", '"& StoredPath & "' )""

結果は次のとおりです。

onclick="deleteRecordAtt(123, 'file.gif')"

これは機能します。しかし、StoredPath 変数に一重引用符が含まれている場合はどうなるでしょうか。または < または & 文字 - アプリにクロスサイト スクリプティングのセキュリティ ホールが必要でない限り、これらは常に Server.HTMLEncode() を使用してエンコードする必要があります。

必要なのは、帯域外の文字を JavaScript \xNN 16 進文字エスケープにエスケープすることにより、文字を JavaScript 文字列リテラルにエスケープする VBScript 関数です。単純なバージョンは次のようなものから始まります (未テスト、私は VBScript コーダーではありません):

<%
    jsLiteral= Replace(StoredPath, "\", "\x5C")
    jsLiteral= Replace(jsLiteral, "'", "\x27")
    jsLiteral= "'" & jsLiteral & "'"
%>
<input ... onclick="deleteRecordAtt(<%= AttID %>, <%= Server.HTMLEncode(jsLiteral) >)">

編集して質問の編集を追加します。

objConn.Execute("UPDATE EMAIL_SEND_ATTACHMENTS set ATTACHMENTS = Replace(LTRIM(RTRIM(ATTACHMENTS)), '"& StoredPath & "' ,'') WHERE EMAIL_LETTERS_HOLD_ID= "& AttID & " ")

繰り返しますが、エスケープせずに文字列を連結します。これにより、SQL インジェクション エラーが発生します。StoredPath 変数に一重引用符が含まれていると、クエリが失敗します。そして、攻撃者が次のようなことを言った場合:

StoredPath=', ''));DROP TABLE EMAIL_SEND_ATTACHMENTS;--

それではおっと、さようならデータベース!より可能性が高いのは、現在 Web でロシアのマルウェアを拡散している多くの自動化された SQL インジェクション攻撃の 1 つに見舞われる可能性です。

SQL 文字列リテラルをエスケープするか、パラメーター化されたクエリを使用することをお勧めします。

はいをクリックしても何も起こりません

ここでも、JavaScript エラーがオンになっていることを確認して、問題を確認できるようにします。この場合の問題かどうかはわかりませんが、次のとおりです。

document.location.href="delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+escape(document.location.href);

読む必要があります:

location.href= "delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+encodeURIComponent(location.href);

JavaScript の escape() は、encodeURIComponent() によって実行される適切な URL エンコーディングと微妙にそして迷惑なほど互換性がないため、決して使用しないでください。

また、location (window.location の略) は、実際には document.location とは別のオブジェクトであり、ブラウザーを新しいページに移動する場合に使用する正しいオブジェクトです。document.location への書き込みは動作しないはずですが、運が良ければ一部のブラウザーで動作する場合があります。

于 2009-01-19T14:51:03.080 に答える
0

javascript の deleteRecordAtt 関数の問題でしょうか?
2番目のパラメータが存在しない変数として扱われているのではないでしょうか?
JavaScript関数も追加していただけると助かります。

于 2009-01-19T14:27:37.950 に答える