2012-02-07 203 views
0

一般的なエラーですが、それでも解決できません。 私は、というステータスのというセレクトアイテムを持っています。ユーザーは自分の雇用状況を選択できます。結果を取得し、user_table(アクセスファイル)ステータスセルを更新するだけです。 ご返信いただければ幸いです!クエリ式の構文エラー(演算子がありません)

コードは以下の通りです:

<!--#include file="../conn/conn.asp"--> 
<% 
id=request.QueryString("id") 
status=request.Form("status") 
sql="select * from user_table where id="&id 
set rs=conn.execute(sql)  
sql="update user_table set Status='"+status+"' where id="&id 
'response.Write sql 
conn.execute(sql) 
conn.close 
response.Write "<script>alert('Change Sucessful!');</script>" 
set conn=nothing 
response.end() 
%> 
+4

こんにちは、SQLインジェクション! –

+1

最初に:あなたはどんなエラーを受けていますか? 2番目:それはおそらくあなたがこれを読むためにいくつかの良いを行うだろう:http://en.wikipedia.org/wiki/SQL_injectionとこれ:http://en.wikipedia.org/wiki/Security_through_obscurity –

+0

それで問題は何ですか?あなたのテストでIDとステータスの値は何を使用していますか?また、SQLインジェクション攻撃を避けるために、パラメータ化されたクエリを使用することをお勧めします。 – CodeThug

答えて

0

私は葉が開いconnのconn.asp推測していますか?それ以外の場合は、それを開く必要があります。また、response.write sql行のコメントを外すときに表示されるものは何ですか?

あなたは間違いなく自分自身をハッカーに開放しています。あなたは、request.formまたはrequest.querystringから来るものを 'きれいにする'必要があります(少なくともreplace(..., "'", "''")、またははるかに良いストアドプロシージャを使用してストレートSQLの代わりに使用します)

+0

"ストアドプロシージャの使用"は実際の解決策ではありません。 'sql =" EXEC spUpdateMyStatus "+ status +"、 "+ id"は依然として注入脅威です。解決策は、SPが使用されているかどうかが重要でないかどうかをパラメータ化したクエリを使用することです。 – AnthonyWJones

+0

置換は非常に壊れやすい「修正」です。この日と年齢でパラメータ化されたクエリを使用しない理由はありません。 –

+0

どのように脆弱ですか? (私はあなたを信じていませんが、ハッカーがどのようにそれを打ち破ることができるのか不思議です) – Rodolfo

1

conn.execute(SQL)での問題だけでなく、Response.Endの()

それを修正するには、あなたがいずれかの実行する必要があります。

conn.execute sql 

または

Call conn.execute(sql) 

しかし、あなたがたああ、あなたのテクニックにはセキュリティ上の問題があるので、投稿されたその他のコメントに従うべきです。パラメータを使用するように変更することを検討してください。

<!--#include file="../conn/conn.asp"--> 
<% 

id = request.QueryString("id") 
status = request.Form("status") 

sql = "select * from user_table where id = @id" 
Set cmd = CreateObject("ADODB.Command") 
cmd.CommandText = sql 
Set cmd.ActiveConnection = conn 
cmd.Prepared = True 
cmd.Parameters.Refresh 
cmd.Parameters("@id") = id 
Set rs = cmd.Execute 
Set rs = nothing 
Set cmd = nothing 

sql = "update user_table set status = @status where id = @id" 
Set cmd = CreateObject("ADODB.Command") 
cmd.CommandText = sql 
Set cmd.ActiveConnection = conn 
cmd.Prepared = True 
cmd.Parameters.Refresh 
cmd.Parameters("@status") = status 
cmd.Parameters("@id") = id 
Set rs = cmd.Execute 
Set rs = nothing 
Set cmd = nothing 

response.Write "<script>alert('Change Sucessful!');</script>" 
Set conn = nothing 
response.end 
%> 
関連する問題