我有一个文本框,用于在站点内搜索数据。我的客户想要什么,
1)在搜索字段中输入任何文本,然后单击搜索符号。
2)使用“代理”之类的Web代理工具将请求发送到服务器
3)在脚本后面添加参数
test<~script>confirm(123)<~/script>
这里发生的是
专家输入的XSS脚本无需任何输入即可反映在响应中。请看下面的图片,您将有一个主意:-
![在此处输入图片描述] [1]
伙计们,让我知道您是否需要更多与此相关的信息。请帮助大家,任何帮助将不胜感激。我想从服务器端阻止攻击。
HTML和JS代码:-
<asp:TextBox ID="txtSearch" runat="server" class="txtfld-search" oncopy="return false" oncut="return false" onpaste="return false"></asp:TextBox>
JS代码:-
<script type="text/javascript">
$(document).ready(function () {
$('#ctl00_topNavigation_txtSearch').keyup(function () {
var $th = $(this);
$th.val($th.val().replace(/[^.%a-zA-Z0-9 ]/g,
function (str) {
alert('Special characters not allowed except %');
return '';
}));
});
});
另请参见后面的代码:-
protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{
Response.Redirect("search.aspx?tx=" + txtSearch.Text);
}
另外,请参见搜索部分的代码:-
private void SearchResult()
{
DataTable dt;
if (Session["Search"] == null)
{
ResXResourceReader reader = new ResXResourceReader(Server.MapPath("~/App_GlobalResources/Strings.en-US.resx"));
IDictionaryEnumerator id = reader.GetEnumerator();
string sResourceFile = Server.MapPath("~/App_GlobalResources/Strings.en-US.resx");
XmlDocument xmlResource = new XmlDocument();
xmlResource.Load(sResourceFile);
XmlNodeList elmData = xmlResource.SelectNodes("//root/data");
dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Title", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Description", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Url", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Link", System.Type.GetType("System.String")));
foreach (XmlElement element in elmData)
{
DataRow dr = dt.NewRow();
dr["ID"] = element.GetAttribute("name");
//dr["Title"] = element.GetAttribute("name");
XmlNodeList sDescription = element.SelectNodes("value");
dr["Title"] = sDescription.Count > 0 ? sDescription.Item(0).InnerText : string.Empty; ;
dr["Description"] = string.Empty;
XmlNodeList sUrl = element.SelectNodes("comment");
if (sUrl.Count > 0)
{
Int32 sPgTitle = sUrl.Item(0).InnerText.LastIndexOf(".") + 1;
if (sPgTitle > 0)
{
dr["Url"] = sUrl.Item(0).InnerText;
//dr["Url"] = Request.Url.Host.ToLower() + "/rbank/" + sUrl.Item(0).InnerText;
dr["Link"] = string.Empty;
}
else
{
dr["Link"] = sUrl.Item(0).InnerText;
}
dt.Rows.Add(dr);
}
}
//foreach (DataRow dr in dt.Rows)
//{
// DataRow[] rDesc = dt.Select("Link <> ''");
// for (int i = 0; i < rDesc.Length; i++)
// {
// DataRow[] rTitle = dt.Select("ID = '" + rDesc[i]["Link"] + "'");
// if (rTitle.Count() > 0)
// {
// rTitle[0]["Description"] = rDesc[i]["Title"];
// }
// }
//}
DataRow[] drDelete = dt.Select("Link <> ''");
foreach (DataRow drCheck in drDelete)
{
dt.Rows.Remove(drCheck);
}
dt.TableName = "FilterValues";
reader.Close();
Session["Search"] = dt;
}
else
{
dt = Session["Search"] as DataTable;
}
DataView dv = new DataView();
dv.Table = dt;
**dv.RowFilter = "Description LIKE ('%" + Request.QueryString["tx"].Trim().ToLower() + "%') or Title LIKE ('%" + Request.QueryString["tx"].Trim().ToLower() + "%')";**
dv.Sort = "Title ASC";
dgrdPages.DataSource = dv;
dgrdPages.DataBind();
lblSearchWords.Text = Request.QueryString["tx"].Trim();
lblFilesFound.Text = dv.Count.ToString();
}
我发现dv.RowFilter可以像这样通过SQL注入来提供。我想防止这种情况。请帮忙。
正如其他朋友所提到的,客户端代码很容易被忽略。因此,我们可以将您对javascript所做的工作翻译成c#,并添加我的代码,以删除多余的空间并将其合并为一个:
if (Regex.IsMatch(txtSearch.Text, "[^a-zA-Z0-9 %]"))
{
//error
Response.Redirect("Error.aspx?tx=It's a Shame Dude!");
}
else
{
//Remove multiple spaces
String ClearSpaces = Regex.Replace(txtSearch.Text, @"\s+", " ");
Response.Redirect("search?tx=" + HttpUtility.UrlEncode(ClearSpaces));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句