Как отфильтровать некоторые уязвимости, вызывающие символы в строке запроса? - PullRequest
0 голосов
/ 07 апреля 2009

Мне нужно отфильтровать символы, такие как /? - ^% {} []; $ = * `# | & @ '\" <> () +, \. Мне нужно заменить это на пустую строку, если она там есть в строке запроса. Пожалуйста, помогите мне. Я использую это на страницах ASP.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2009

Лучшей идеей было бы использовать функцию что-то вроде:

Public Function MakeSQLSafe(ByVal sql As String) As String
    'first i'd avoid putting quote chars in as they might be valid? just double them up.
    Dim strIllegalChars As String = "/?-^%{}[];$=*`#|&@\<>()+,\"
    'replace single quotes with double so they don't cause escape character
    If sql.Contains("'") Then
        sql = sql.Replace("'", "''")
    End If
    'need to double up double quotes from what I remember to get them through
    If sql.Contains("""") Then
        sql = sql.Replace("""", """""")
    End If
    'remove illegal chars
    For Each c As Char In strIllegalChars
        If sql.Contains(c.ToString) Then
            sql = sql.Replace(c.ToString, "")
        End If
    Next

    Return sql
End Function

Это не было проверено и, возможно, его можно сделать более эффективным, но оно должно помочь вам. Где бы вы ни выполняли SQL в своем приложении, просто оберните SQL в эту функцию, чтобы очистить строку перед выполнением:

ExecuteSQL (MakeSQLSafe (strSQL))

Надеюсь, что поможет

0 голосов
/ 14 апреля 2009

Я использую маршрутизацию URL, и я обнаружил, что это хорошо работает, передайте каждую часть вашего URL этой функции. Это больше, чем нужно, поскольку он преобразует символы типа «&» в «и», но вы можете изменить его так, чтобы он подходил:

public static string CleanUrl(this string urlpart) {

    // convert accented characters to regular ones
    string cleaned = urlpart.Trim().anglicized();

    // do some pretty conversions
    cleaned = Regex.Replace(cleaned, "&nbsp;", "-");
    cleaned = Regex.Replace(cleaned, "#", "no.");
    cleaned = Regex.Replace(cleaned, "&", "and");
    cleaned = Regex.Replace(cleaned, "%", "percent");
    cleaned = Regex.Replace(cleaned, "@", "at");

    // strip all illegal characters like punctuation
    cleaned = Regex.Replace(cleaned, "[^A-Za-z0-9- ]", "");

    // convert spaces to dashes
    cleaned = Regex.Replace(cleaned, " +", "-");

    // If we're left with nothing after everything is stripped and cleaned
    if (cleaned.Length == 0)
        cleaned = "no-description";

    // return lowercased string
    return cleaned.ToLower();
}

// Convert accented characters to standardized ones
private static string anglicized(this string urlpart) {
    string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
    string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";

    string cleaned = urlpart;

    for (int i = 0; i < beforeConversion.Length; i++) {
         cleaned = Regex.Replace(urlpart, afterConversion[i].ToString(), afterConversion[i].ToString());
    }
    return cleaned;

    // Spanish : ÁÉÍÑÓÚÜ¡¿áéíñóúü"

}
0 голосов
/ 08 апреля 2009

Как и при любой очистке строк, вам гораздо лучше работать с белым списком, который указывает, какие символы разрешены , а не с черным списком символов, которые не .

Этот вопрос о фильтрации тегов HTML привел к принятию ответа, в котором предлагалось использовать регулярное выражение для сопоставления с белым списком: Как отфильтровать все теги HTML, кроме определенного белого списка? что-то очень похожее.

...