2012-03-31 3 views
0

Является ли этот код достаточным для защиты от атак SQL-инъекций и инъекций PHP-инъекций?Является ли этот код достаточным для защиты от атак SQL-инъекций и инъекций PHP-инъекций?

У меня есть эта функция в включаемый файл функций:

function strclean ($string) { 
    $outstr = ''; 
    if (strlen ($string) > 0) { 
    $ix = 0; 
    $char = substr ($string, $ix, 1); 
    // strip leading spaces 
    while ($char == ' ') { 
     $ix = $ix + 1; 
     $char = substr ($string, $ix, 1); 
     } 
    // disarm naughty characters 
    while ($ix < strlen ($string)) { 
     $char = substr ($string, $ix, 1); 
     if ($char == '<') $char = '&lt;'; 
     else if ($char == '>') $char = '&gt;'; 
     else if ($char == '"') $char = '&quot;'; 
     else if ($char == '&') $char = '&amp;'; 
     else if ($char < chr(20)) $char = ''; 
     $outstr = $outstr . $char; 
     $ix = $ix + 1; 
     } 
    // strip trailing spaces 
    while (substr ($outstr, strlen ($outstr) - 1, 1) == ' ' && strlen ($outstr) > 0) { 
     $outstr = substr ($outstr, 0, strlen ($outstr) - 1); 
     } 
    $outstr = mysql_real_escape_string ($outstr); 
    } 
    return $outstr; 
    } 

Позже в моей странице, я различные строки возвращенного из формы ввода, такие как в этом примере:

$username = strclean ($_POST['username']); 
$password = strclean ($_POST['password']); 

И даже позже у меня есть следующий SQL:

$result = mysql_query ('SELECT * FROM users WHERE 
    username = "' . $username . '"', $dbconn) or die (mysql_error()); 

Я не ищу имя пользователя и пароль togeth er в запросе. Несколько строк после этого я проверить действительный пароль, как это:

if ($rowsfound == 1) { 
    $userrow = mysql_fetch_array ($result); 
    $userword = $userrow ["password"]; 
    if ($userword == $password) { 
    // logon 
    } 
    else { 
    // incorrect password 
    } 
    } 
else if ($rowsfound == 0) { 
    // unknown user 
    } 
else { 
    // something strange happened! possible sql injection attack? 
    } 
+4

Почему вы пытаетесь сделать это самостоятельно, вместо того чтобы использовать функции в ядре PHP? –

+2

Учитывая, что это долго и сложно читать, я бы сказал, что это не выполнимый подход. –

+0

Возможный дубликат функции очистки Secure XSS (регулярно обновляется)] (http://stackoverflow.com/questions/6382442/secure-xss-cleaning-function-updated-regularly) –

ответ

1

Общим правилом является все отрицать и позволяют только через допустимые символы, а не удаление, что вы считаете недействительным. Наиболее важным аспектом является то, что вы делаете с этой строкой впоследствии. Если у вас есть строка позже: tsql = "SELECT * FROM Users WHERE Username='" . $username . "' AND " тогда это основная область риска, хотя mysql_real_escape_string следует избегать этого.

Использование библиотек или функций, которые позволяют передавать параметры в базу данных, никогда не может быть любой SQL-инъекции, поскольку параметры базы данных не могут быть интерпретированы в TSQL, оставляя только возможность внедрения PHP/Javascript. В принципе, взгляните на функции bind_param как на настоящую защиту.

При отображении данных на экране рассмотрите что-то вроде htmlspecialchars(), чтобы преобразовать его в HTML. Нет смысла хранить что-то с экранированным, если вам нужно, чтобы он не удалялся позже, а необработанные данные в базе данных не представляют никакого риска, пока вы всегда считаете его необработанным.

Таким образом, приведенный вами код может включать или не уменьшать инъекции, но существует слишком много комбинаций, чтобы исключить каждую возможность, включая такие аспекты, как пользователь, использующий одинарные кавычки (вы заменяете только двойные кавычки). Все пользовательские данные ввода являются потенциально опасными. Не стесняйтесь хранить его в сыром виде, но всякий раз, когда ИСПОЛЬЗУЕТ его, убедитесь, что ваши операции защищены, используя один из указанных выше вариантов.

Теперь мой PHP немного ржавый, но точно такие же правила применяются к SQL Server, Oracle, .NET, Java, любой другой базе данных/языку.

+0

Позже у меня есть строка, которая гласит: '$ result = mysql_query ('SELECT * FROM users WHERE username ="'. $ Username. '"', $ Dbconn);' Я не ищу пароль в запросе , Несколько строк позже, я проверяю предоставленный пароль на пароль на db. – Fredashay

+1

Да, это именно то, чего нужно избегать! Если кто-то обнаруживает недостаток в вашей сложной логике, они могут вводить любое утверждение в этот SQL. Посмотрите на функции 'bind_param' в mysql lib и используйте их. При этом не требуется никакого экранирования. В теории вы можете предположить, что 'mysql_real_escape_string' защищает от этого, но я никогда не принимаю этот шанс. – JSobell

Смежные вопросы