2012-02-07 92 views
0

我知道这是一个常见错误,但我仍然无法自己解决。 我想要做的是我有一个名为状态 SELECT项目,允许用户选择他们的就业状态,我想只是得到结果和更新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注入! – 2012-02-07 17:43:01

+1

首先:你得到什么错误,在哪里?第二:这可能会让你读一些:http://en.wikipedia.org/wiki/SQL_injection和这个:http://en.wikipedia.org/wiki/Security_through_obscurity – 2012-02-07 17:45:04

+0

那么问题是什么?你在测试中使用了什么样的id和状态值?另外,我建议使用参数化查询来避免SQL注入攻击。 – CodeThug 2012-02-07 17:53:33

回答

0

我猜的conn.asp离开康涅狄格州开?否则你需要打开它。另外,当你取消注释response.write sql行时会显示什么?

而且,你绝对向黑客开放自己。你需要'清理'来自request.form或request.querystring的任何东西(至少有一个replace(..., "'", "''"),或者更好的,使用存储过程而不是直接的sql

+0

“使用存储过程”并不是真正的解决方案。 'sql =“EXEC spUpdateMyStatus”+ status +“,”+ id'仍然是一个注入威胁。解决方案是使用参数化查询是否使用SP是不重要的。 – AnthonyWJones 2012-02-07 17:57:44

+0

替换是一个非常脆弱的“修复”。我没有看到任何理由不在今天和这个年龄使用参数化查询。 – 2012-02-07 18:00:57

+0

它怎么脆弱? (不是我不相信你,但我很好奇黑客是如何打破它的) – Rodolfo 2012-02-07 20:09:53

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 
%> 
相关问题