Внедрение SQL на ВСТАВКЕ

Такое решение может помочь вам.

Вы должны добавить overflow: hidden в целом .side-nav и отключить перенос текста в a (или сделать flex с min-width)

nav {
  background-color: #f5f5f5;
}

nav a {
  text-decoration: none;
  color: black;
}

.side-nav {
  position: fixed;
  top: 54px;
  left: 0;
  bottom: 0;
  width: 5%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  transition: width 2s;
  overflow: hidden;
}

.side-nav>.side-nav-top {
  display: flex;
  flex-direction: column;
}

.side-nav a {
  white-space: nowrap;
}

.side-nav>.side-nav-top>a>span:first-child {
  display: inline-block;
  margin: 5px 20px 5px 20px;
  width: 20px;
}

.side-nav i {
  color: #909090;
}

.side-nav:hover {
  width: 40%;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title>Home</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.dev.js"></script>
  <link href="https://fonts.googleapis.com/css?family=Dosis" rel="stylesheet">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
  <link rel="stylesheet" href="/css/index.css">
</head>

<body>
  <nav class="side-nav">
    <div class="side-nav-top">
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
      <a href="#"><span><i class="fas fa-home"></i></span><span class="hide">The Home page</span></a>
    </div>
  </nav>
</body>

</html>

28
задан Brad 25 March 2009 в 17:21
поделиться

7 ответов

Инжекция может произойти на любом SQL-операторе, не выполненном правильно.

Например, давайте притворимся, что Ваша таблица комментария имеет два поля, целочисленный идентификатор и строку комментария. Таким образом, Вы были бы INSERT следующим образом:

 INSERT INTO COMMENTS VALUES(122,'I like this website');

Рассмотрите кого-то вводящего следующий комментарий:

'); DELETE FROM users; --

Если Вы просто помещаете строку комментария в SQL без какого-либо processesing, это могло бы повернуть Ваш сингл INSERT в к следующим двум операторам, сопровождаемым комментарием:

INSERT INTO COMMENTS VALUES(123,''); DELETE FROM users; -- ');

Это удалило бы все из Вашего users таблица. И существуют люди, готовые потратить весь день нахождение правильного имени таблицы к пустому методу проб и ошибок использования и различным приемам. Вот описание того, как Вы могли выполнить Атаку с использованием кода на SQL.

Необходимо использовать параметризованные SQL-операторы для предотвращения этого.

И это не только из соображений безопасности. Например, если Вы создаете свои SQL-операторы наивно следующий комментарий:

I'm just loving this website

вызвал бы ошибку синтаксиса SQL из-за апострофа, интерпретируемого SQL как заключительная кавычка.

58
ответ дан Cœur 28 November 2019 в 02:31
поделиться

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

SqlCommand command = connection.CreateCommand();
command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)";
command.AddParameterWithValue( "val1", value1 );
command.AddParameterWithValue( "val2", value2 );
command.AddParameterWithValue( "txt", text );

...
27
ответ дан tvanfosson 28 November 2019 в 02:31
поделиться

Внедрение SQL может произойти любое время, Вы пасуете назад запрос к базе данных. Вот простая демонстрация:

Объясненное внедрение SQL

Ключ, в.NET, должен сделать, поскольку Dave Webb дал. Это предотвратит инжекционную попытку путем затрагивания всей строки как одного параметра, который будет отправлен, обработки всех символов, которые могли бы быть интерпретированы SQL Server, чтобы изменить запрос или добавить дополнительные команды.

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

3
ответ дан K. Brian Kelley 28 November 2019 в 02:31
поделиться

Да, это может. Скажем, клиент отправляет это:

OR 1 = 1

Это может быть очень болезненно для Вашего

  SELECT * FROM admin WHERE name = @name AND password = @password

Можно предотвратить это с

0
ответ дан boj 28 November 2019 в 02:31
поделиться

Да, они могут произойти. Самый легкий способ принять меры против этого состоит в том, чтобы использовать подготовленные операторы вместо того, чтобы создать SQL вручную.

Так, а не это:

String sql = 
 String.Format("INSERT INTO mytable (text_column) VALUES ( '{0}' )",
   myTextBox.Text); // Unsafe!

Вы сделали бы что-то вроде этого:

String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer

Затем добавьте текст текстового поля в качестве параметра к Вашему DbCommand, который заставит это быть автоматически оставленным и заменит"?" в SQL.

0
ответ дан Eric Petroelje 28 November 2019 в 02:31
поделиться

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

  1. Проверьте и ввод данных пользователем формата на стороне сервера. Клиентская проверка и пределы могут легко быть обходами с инструментами как WebScarab, или путем спуфинга формы.

  2. Настройте соответствующие полномочия для учетной записи пользователя базы данных. Веб-приложение должно использовать отдельную учетную запись или роль в Вашей базе данных с полномочиями, ограниченными только таблицами, представлениями и процедурами, требуемыми запустить Ваше приложение. Удостоверьтесь, что пользователь не имеет избранных прав на системных таблицах

  3. Скройте подробные сообщения об ошибках от пользователей и используйте менее общие названия для своих объектов. Это поражает меня, как часто можно определить тип сервера (оракул, mysql, sqlserver) и найти основную информацию о схеме в сообщении об ошибке и затем получить информацию от таблиц, названных 'пользователем (пользователями)', 'сотрудником (сотрудниками)'. Если Вы не установили свои полномочия как в (2), и я могу определить Ваш тип сервера, Вы открыты для операторов как это для SQL Server

    ВЫБЕРИТЕ table_name ИЗ information_schema.table

    ВЫПОЛНИТЕ sp_help foundTableName

0
ответ дан Gary.Ray 28 November 2019 в 02:31
поделиться

Самый легкий способ принять меры против той формы Внедрения SQL, должен использовать параметры и хранимые процедуры, скорее затем создающие sql операторы для выполнения. (В C# или внутренне к SQL Server).

Однако я не совсем уверен, что необходимо проводить время на этом, если, конечно, это не корпоративная политика, поскольку возможности его когда-либо происходящий внутренне минимальны в лучшем случае и если бы это действительно происходило, то я надеялся бы, что Вы сразу знали бы, кто это.

-4
ответ дан Bravax 28 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: