Steve Blatch Ответов: 1

Классическое обновление ASP для базы данных SQL VBSCRIPT


Веб-сайт клиента перестал работать на веб-сайте, размещенном на Fasthosts (Великобритания). Ядру сайта уже более 10 лет, и он написан на ASP. В настоящее время я конвертирую его в PHP по соображениям безопасности и здравомыслия. Мне просто нужно быстро все исправить, пока это не сделано.Я извлекаю данные из базы данных в порядке и пишу новые записи.

Я использую форму для ввода деталей:

<form method="POST" action="<%=MM_editAction%>" name="form1">
  <div align="center">
      <h2 style="text-align: center">Enter the New Vehicle's Details</h2>
      <table width="500" border="0" align="center" cellpadding="2" cellspacing="2">
      <tr bgcolor="#CCCCCC">
      <td bgcolor="#CCCCCC" class="tableleft">Marque</td>
      <td bgcolor="#FFFFFF" class="tableright"><input name="Marque" type="text" value="" size="32">


Эти сведения затем передаются обратно на ту же страницу с помощью:

<input type="hidden" name="MM_insert" value="form1">
<td><input type="submit" value="Insert record"></td>


<%If (CStr(Request("MM_insert")) = "form1") Then...


Затем содержимое формы преобразуется в переменные и вставляется с помощью следующего оператора:

sql_insert = "INSERT INTO tblCarList ([Marque], [Category], [Model], [VYear], [Miles], [Description1], [Description2], [Description3], [Description4], [Description5], [Description6], [Description7], [Description8], [Description9], [Description10], [Description11], [Description12], [Description13], [Price], [Sold], [Pic1], [Pic2], [Pic3], [Pic4], [VActive]) VALUES ('" & Replace(iMarque,"'","''") & "', '" & iCategory & "', '" & Replace(iModel,"'","''") & "', '" & Replace(iVYear,"'","''") & "', '" & Replace(iMiles,"'","''") & "', '" & Replace(iDescription1,"'","''") & "', '" & Replace(iDescription2,"'","''") & "', '" & Replace(iDescription3,"'","''") & "', '" & Replace(iDescription4,"'","''") & "', '" & Replace(iDescription5,"'","''") & "', '" & Replace(iDescription6,"'","''") & "', '" & Replace(iDescription7,"'","''") & "', '" & Replace(iDescription8,"'","''") & "', '" & Replace(iDescription9,"'","''") & "', '" & Replace(iDescription10,"'","''") & "', '" & Replace(iDescription11,"'","''") & "', '" & Replace(iDescription12,"'","''") & "', '" & Replace(iDescription13,"'","''") & "', '" & Replace(iPrice,"'","''") & "', '" & Replace(iSold,"'","''") & "', '" & Replace(iPic1,"'","''") & "', '" & Replace(iPic2,"'","''") & "', '" & Replace(iPic3,"'","''") & "', '" & Replace(iPic4,"'","''") & "', '" & Replace(iVActive,"'","''") & "')"


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

sql_replace = "REPLACE INTO tblCarList ([Marque], [Category], [Model], [VYear], [Miles], [Description1], [Description2], [Description3], [Description4], [Description5], [Description6], [Description7], [Description8], [Description9], [Description10], [Description11], [Description12], [Description13], [Price], [Sold], [Pic1], [Pic2], [Pic3], [Pic4], [VActive]) VALUES ('" & Replace(iMarque,"'","''") & "', '" & iCategory & "', '" & Replace(iModel,"'","''") & "', '" & Replace(iVYear,"'","''") & "', '" & Replace(iMiles,"'","''") & "', '" & Replace(iDescription1,"'","''") & "', '" & Replace(iDescription2,"'","''") & "', '" & Replace(iDescription3,"'","''") & "', '" & Replace(iDescription4,"'","''") & "', '" & Replace(iDescription5,"'","''") & "', '" & Replace(iDescription6,"'","''") & "', '" & Replace(iDescription7,"'","''") & "', '" & Replace(iDescription8,"'","''") & "', '" & Replace(iDescription9,"'","''") & "', '" & Replace(iDescription10,"'","''") & "', '" & Replace(iDescription11,"'","''") & "', '" & Replace(iDescription12,"'","''") & "', '" & Replace(iDescription13,"'","''") & "', '" & Replace(iPrice,"'","''") & "', '" & Replace(iSold,"'","''") & "', '" & Replace(iPic1,"'","''") & "', '" & Replace(iPic2,"'","''") & "', '" & Replace(iPic3,"'","''") & "', '" & Replace(iPic4,"'","''") & "', '" & Replace(iVActive,"'","''") & "')"


Я получаю сообщение об ошибке сервера 500.

Поле ID является первичным ключом, но запись выбирается с помощью переданной переменной URL:

<%
Dim thevehicle
Dim thevehicle_numRows
Dim tvSQLsource
Dim tvSQLid
Dim tvSQLstring

tvSQLsource = "SELECT * FROM tblCarList WHERE ID = "
tvSQLid = Request.Querystring("ID")
tvSQLstring = tvSQLsource & tvSQLid
Set thevehicle = Server.CreateObject("ADODB.Recordset")
thevehicle.ActiveConnection = MM_database_STRING
thevehicle.Source = tvSQLstring
thevehicle.CursorType = 0
thevehicle.CursorLocation = 2
thevehicle.LockType = 1
thevehicle.Open()

thevehicle_numRows = 0
%>


Строка подключения к базе данных выглядит следующим образом:

<!-- #include virtual = "/my_db/adovbs.inc" -->
<%
' Path to Databases
Dim MM_database_STRING, MM_database_STRINGPath, MM_database_STRINGPathBlank
MM_database_STRING = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("\my_db\car_database_new.mdb")
MM_database_STRINGPath = Server.MapPath("\my_db\car_database_new.mdb")
%>


Любая помощь в этом была бы оценена по достоинству, так как я не держал в курсе кодирования уже более 10 лет.

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

Я изменил форму и имена переменных со страницы новой записи при создании страницы обновления записи.

1 Ответов

Рейтинг:
2

Richard Deeming

В SQL нет команды "заменить в". Ты ищешь меня. UPDATE:
Обновление (Transact-SQL) - SQL Server | Microsoft Docs[^]

Но у вас есть гораздо большая проблема: этот код уязвим для SQL-инъекций:
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]

Если вы переписываете на PHP, вам нужно будет использовать подготовленные операторы:
PHP: SQL-инъекция - руководство пользователя[^]
РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]


Редактировать: Как указала Мич в комментариях, REPLACE INTO действительно существует в MySQL:
MySQL :: MySQL 8.0 справочное руководство :: 13.2.9 оператор замены[^]

Не очевидно, к какой СУБД подключается код. Если это MySQL, я подозреваю, что вам нужно будет передать первичный ключ записи, которую вы пытаетесь заменить.


Steve Blatch

Вау, Ричард, я действительно ценю твою быструю реакцию. Вы так правы в вопросах безопасности, что я прошу специалиста преобразовать сайт. Просто нужно пережить следующие несколько дней! Я попробую и дам тебе знать, как у меня дела!

MadMyche

Я действительно в это верю REPLACE INTO это MySql. И я не скучаю по всему коду MacroMedia из 90-х годов

Richard Deeming

Ты прав.:
MySQL :: MySQL 8.0 справочное руководство :: 13.2.9 оператор замены[^]

Это не то, что я видел раньше, и я не могу сказать, что я увлечен синтаксисом. Похоже, что он ближе к SQL Server ПОГЛОЩАТЬ[^] чем UPDATE- но это менее очевидно (ко мне) что он делает.

Однако я был бы удивлен, если бы исходный код использовал MySql. :)

MadMyche

Это классический синтаксис MacroMedia Dreamweaver с MM_
Что-то напоминает мне заявление Hybris ImpEx: "INSERT_UPDATE"