Herboren Ответов: 0

Я не думаю, что получаю полный редирект, и не уверен, что он загружает веб-страницу.


Мне дали задание создать собственную поисковую систему с помощью gcse. Мне также было предоставлено более 300 сайтов/доменов в белом списке, но из-за явной силы нашего прокси-сервера не все сайты в белом списке кажутся доступными. Я попытался создать инструмент для перенаправления URL-адреса и попытался загрузить через downloadData в байт [], чтобы увидеть, доступен ли Uri. Проблема в том, что наш прокси вернет dns_unresolved, не найден или прокси заблокирован. Я решил, что просто проверю, найден ли в документе "DOCTYPE" или термины заблокированы прокси-сервером "<proxyservername>".

Мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Windows.Forms;

namespace Isitsecure
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            lstResults.Columns.Add("Host", 285, HorizontalAlignment.Left);
            lstResults.Columns.Add("Redirect", 285, HorizontalAlignment.Left);
            lstResults.Columns.Add("Status", 150, HorizontalAlignment.Left);
        }

        public string[] redirectStrings;
        public string[] listStrings;
        List redirectUrls = new List();

        private void btnLoad_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                try
                {
                    lstResults.Items.Clear();
                    Array.Clear(listStrings, 0, listStrings.Length);
                    Array.Clear(redirectStrings, 0, redirectStrings.Length);
                    redirectUrls = new List();

                } catch(Exception ex) { }

                ofd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                ofd.FilterIndex = 2;
                ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                ofd.RestoreDirectory = true;

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    if (ofd.FileName != null)
                    {
                        listStrings = File.ReadAllLines(ofd.FileName); 
                        lblCount.Text = listStrings.Count().ToString();
                    }
                }
            }

            btnLoad.Enabled = false;
            rl.Show();
            bgRedirectFinder.RunWorkerAsync();
        }

        public string GetRedirectUrl(string url)
        {
            try
            {
                HttpWebRequest rqst = (HttpWebRequest)WebRequest.Create(url);
                rqst.AllowAutoRedirect = false;
                rqst.Timeout = 2000;
                rqst.Method = "HEAD";
                HttpWebResponse response = (HttpWebResponse)rqst.GetResponse();

                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    return response.Headers["Location"];
                }
                else
                {
                    return url;
                }
            }
            catch (WebException we)
            {
                return null;
            }
        }

        public string GetSource(string url)
        {
            using (WebClient wc = new WebClient())
            {
                try
                {
                    byte[] src;
                    string _source = string.Empty;
                    src = wc.DownloadData(url);
                    _source = System.Text.Encoding.ASCII.GetString(src);
                    return _source;
                }
                catch (ArgumentNullException ex)
                {
                    return ex.Message;
                }
                catch (WebException ex)
                {
                    return ex.Message;

                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                finally
                {
                    //call this if exception occurs or not
                    //in this example, dispose the WebClient
                    wc.Dispose();
                }
            }

        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            btnSubmit.Enabled = false;
            bgWork.RunWorkerAsync();
            lblComplete.Visible = true;
        }

        private void bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            ListViewItem lvi = new ListViewItem();

            try
            {
                for (var s = 0; s  { lvi = lstResults.Items.Add(string.Format("{0}", listStrings[s])); }));
                        lstResults.BeginInvoke(new Action(() => { lvi.SubItems.Add(string.Format("{0}", redirectStrings[s])); }));
                        lstResults.BeginInvoke(new Action(() => { lvi.SubItems.Add(string.Format("PASSED")); }));
                        source = string.Empty;
                    }
                    else
                    {
                        lstResults.BeginInvoke(new Action(() => { lvi = lstResults.Items.Add(string.Format("{0}", listStrings[s])); }));
                        lstResults.BeginInvoke(new Action(() => { lvi.SubItems.Add(string.Format("{0}", redirectStrings[s])); }));
                        lstResults.BeginInvoke(new Action(() => { lvi.SubItems.Add(string.Format("FAIL")); }));
                        source = string.Empty;
                    }

                    int percentage = (s + 1) * 100 / redirectStrings.Length;
                    bgWork.ReportProgress(percentage);
                    this.Invoke(new MethodInvoker(delegate { ResizeListViewColumns(lstResults); }));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("An error has occurred: " + ex);
            }
        }

        private void ResizeListViewColumns(ListView lv)
        {
            foreach (ColumnHeader column in lv.Columns)
            {
                if (column.Text != "Redirect" && column.Text != "Host")
                {
                    column.Width = -2;
                }
            }
        }

        private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            prgrBar.Value = e.ProgressPercentage;
            lblPerc.Text = string.Format("{0}%", e.ProgressPercentage.ToString());
        }

        private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnSubmit.Enabled = true;
            MessageBox.Show("Scan complete, please export the results to a CSV file", "Scan Complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Invoke(new MethodInvoker(delegate { lblPosition.Text = string.Empty; }));
            this.Invoke(new MethodInvoker(delegate { lblUrl.Text = string.Empty; }));
            this.Invoke(new MethodInvoker(delegate { lblRedirect.Text = string.Empty; }));
        }

        private void lstResults_VisibleChanged(object sender, EventArgs e)
        {
            ResizeListViewColumns(lstResults);
        }

        private void lblExport_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog
            {
                Title = "Choose file to save to",
                FileName = "hosts.csv",
                Filter = "CSV (*.csv)|*.csv",
                FilterIndex = 0,
                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            if (sfd.ShowDialog() == DialogResult.OK)
            {

                string[] headers = lstResults.Columns
                           .OfType()
                           .Select(header => header.Text.Trim())
                           .ToArray();

                string[][] items = lstResults.Items
                            .OfType()
                            .Select(lvi => lvi.SubItems
                                .OfType()
                                .Select(si => si.Text).ToArray()).ToArray();

                string table = string.Join(",", headers) + Environment.NewLine;
                foreach (string[] a in items)
                {
                    //a = a_loopVariable;
                    table += string.Join(",", a) + Environment.NewLine;
                }
                table = table.TrimEnd('\r', '\n');
                File.WriteAllText(sfd.FileName, table);
            }
        }

        private void lblExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void bgRedirectFinder_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int r = 0; r<= listStrings.Length - 1;r++)
            {
                redirectUrls.Add(GetRedirectUrl(listStrings[r]));
                int percent = (r + 1) * 100 / listStrings.Length;
                bgRedirectFinder.ReportProgress(percent);
            }

            redirectStrings = redirectUrls.ToArray();
        }

        Redirect_Locator rl = new Redirect_Locator();

        private void bgRedirectFinder_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
            rl.prgrRedirects.Value = e.ProgressPercentage;
        }

        private void bgRedirectFinder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnLoad.Enabled = true;
            rl.Hide();
        }
    }
}


Все выходит чистым, но, конечно, не кажется, что он работает правильно, когда я строю его и запускаю.

Что я уже пробовал:

Я попытался проверить статус, но технически статус возвращает true или OK на dns_unresolved или proxy blocked, поэтому httpwebrequest.Состояния не помогает. Кроме того, ввод текста на поддельных сайтах возвращается как httpwebrequest.StatusCode == ОК. Я прибегнул к WebCLient от httpwebrequest только потому, что продолжал получать статус 200 для всех сайтов, включая поддельные сайты. Я решил, что скачаю исходный код, чтобы посмотреть, содержит ли он имя прокси-сервера при блокировке.

Richard Deeming

То using блок уже позаботился о том, чтобы избавиться от WebClient например, так что в этом нет необходимости finally блок.

Если вы просто возвращаете сообщение для всех исключений, вам не нужно перехватывать определенные типы исключений. Последний catch (Exception ex) будет ловить все исключения.

Вы, вероятно, хотите использовать DownloadString вместо DownloadBytes / ASCII.GetString, так как большинство страниц не используют ASCII. То DownloadString[^] метод позаботится о выборе правильной кодировки для вас.

0 Ответов