Intereting Posts
Как сделать зашифрованную кнопку покупки PayPal с пользовательскими полями? Как я вставляю только определенные части PHP-страницы, используя PHP Когда начать? Создание веб-сайта, использующего базу данных закодировать массив Php на json Как проверить, установлен ли мой хостинг-провайдер mod_gzip? Двойной символ подчеркивания в PHP? Symfony / Doctrine: класс не является допустимым сущностью или суперклассифицированным классом Ajax Загрузить картинку переменные, передающие ничего, показывают неопределенную ошибку переменной, поэтому вы хотите поместить значение по умолчанию для переменной Модель Cahining curl_getinfo возвращает код статуса HTTP 200 с несуществующими сайтами Лучший способ загрузить файл в PHP Как in_array проверяет, находится ли объект в массиве объектов? Как отобразить результат массива Как lazy загружать элементы из mysql db, как facebook и twitter (бесконечная прокрутка)

php: как предотвратить SQL-инъекцию из $ _POST

У меня есть сценарий php, и я думаю, что у этого много ошибок. из-за моих ограниченных знаний в конкатенации и SQL-инъекции. В первый раз у меня нет проблем, потому что этот скрипт использует PHP-Mysql.

Но после того, как я попытаюсь перейти на Interbase, я встречаю много неприятностей. Пожалуйста, помогите определить мою ошибку.

этот мой следующий запрос:

$sLimit = ""; if ( isset( $_POST['iDisplayStart'] ) ) { $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; } $sOrder =""; $sOrder = " ORDER BY LINE_NAME "; $sWhere = ""; if (postVar('sSearch') !="" ) { $sWhere = " WHERE (LINE_NAME LIKE '%".$_POST['sSearch']."%' OR MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ". " VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ". " LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ". " START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ". " SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ". " SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ". " PROD_NO LIKE '%".$_POST['sSearch']."%' OR ". " PROD_DATE LIKE '%".$_POST['sSearch']."%') "; } $sQuery = "SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO".$sWhere.$sOrder.$sLimit.";"; $rResult = ibase_query( $sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg() ); $sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; $rResultFilterTotal = ibase_query( $sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg() ); $aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal[0]; 

примечания: мне нужно больше узнать о конкатенации. Спасибо за продвижение.


ошибка:

 Dynamic SQL Error SQL error code = -104 Token unknown - line 3, column 39 '.. ORDER BY LINE_NAME ..' 

Похоже, что он может работать, поэтому, если это не удается, пожалуйста, опишите, как это сделать.

Однако в нем есть одна видимая ошибка: в строках

 $sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 

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

 $sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE FROM DOC_TO".$sWhere.$sOrder.$sLimit.")"; 

В зависимости от вашей среды, кроме того, в вашем коде есть важный недостаток безопасности: например, в строке

 $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 

вы используете $ _POST, чтобы поместить его непосредственно в SQL-запрос, который открывает так называемое SQL-инъекционное отверстие безопасности.

я нашел ответ от руководства AndreKR:

 $sLimit = ""; if ( isset( $_POST['iDisplayStart'] ) ) { settype($iDisplayStart,'integer'); $iDisplayStart = $_POST['iDisplayStart']; $iDisplayLength = $_POST['iDisplayLength']; $sLimit = sprintf(" FIRST ".$iDisplayStart." SKIP ".$iDisplayLength); } 

и измените все $ _POST:

 '%".$_POST['sSearch_0']."%' into ''%".$_POST['sSearch_0']."%'' //this to prevent injection For databases Like Oracle, DB2, MS SQL, Firebird 

и изменение:

 $sQuery = "SELECT COUNT(*) FROM(......) into $sQuery = "SELECT COUNT(*) AS DCOUNT FROM DOC_TO".$sWhere.$sLimit.";"; //delete $sOrder $aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal['DCOUNT']; //change from ......[0] 

и добавить на последней странице php:

 ibase_free_result($aResultTotal); ?>