Показаны сообщения с ярлыком PHP. Показать все сообщения
Показаны сообщения с ярлыком PHP. Показать все сообщения

Unsupported operand type?


PHP слабо стандартизированный язык.
Появление ошибки Unsupported operand type свидетельствует о использовании недопустимого типа данных в операции.
Например умножение переменных переданных POST запросом:

if(isset($_POST['bet'])) $bet = $_POST['bet'];
if(isset($_POST['lines'])) $lines = $_POST['lines'];

$betallt = $bet * $lines;  //Причина ошибки. Пытаемся умножить строки

//Предыдущие версии PHP ошибку не выдавали.

Решается данная проблема путем преобразования данных.
Пример:
$betallt = (int)$bet * (int)$lines;

Ошибка PHP No ending delimiter '�' found in

Писал небольшой скриптик на PHP и вот возникла данная проблема... Появляется ошибка 
No ending delimiter '�' found in. В чем заключалась ошибка и как ее профиксить?


Имеется скрипт, который считывает в массив регулярные выражения из файла txt.


$fp = fopen("sys/01.txt", "r");
$content = '1-2-3';
if ($fp)
{
while (!feof($fp))
{
    $pattern[] = fgets($fp, 999);
}
}
    else echo "Ошибка при открытии файла";
fclose($fp);

01.txt
------------
/1[^>]+3/
/<img src=[^>]+>/
...

 И вот на данном фрагменте и возникает ошибка:

preg_match_all($pattern[0], $content, $link);
print_r($link);

На одном из форумов прочел реплику по поводу ошибки: "В ошибке сказано, что у вас нет закрывающего разделителя (delimiter)."

И вот в чем дело... Файлик с регулярными выражениями сохранен в UTF-8, Тоесть при считывании строки  $pattern[] = fgets($fp, 999); в переменную заносится строка (например /<img src=[^>]+>/) вместе с BOM символами !!!

Тоесть /<img src=[^>]+>/ �, при этом функция preg_match_all расценивает данный символ как модификатор и выдает ошибку.

Поэтому сохраняем файлик без BOM.
если сохраните с ним, то на файлах, где также есть сессии или заголовки, будет ошибка.

PHP Преобразование даты в число (date to int). Словарь для брута по дате.


Для преобразования даты в число, воспользуемся функцией  strtotime();

 $date = '1970-01-01 00:00:00'
$int_date = strtotime("$date GMT"); 
echo $int_date;

Данная функция преобразует дату в строку. На выходе получим количество секунд от базовой даты -  01-01-1970 до введенной нами $date,
в данном примере получим "0" (т. к. $date = '1970-01-01 00:00:00' ).

Теперь к данному числу можно прибавлять количество секунд в днях, часах и т.д. - получая код даты следующего дня или часа и т.д.

echo date("d-m-Y", $int_date + 86400);  - //Получим строку следующего дня '1970-01-02'

Для создания списка от одной даты до другой воспользуемся ниже описанной функцией:

<?
function Get_date_list($date, $date2)
{
$file = 'brute.txt';

//Вводим дату начала... для нашего списка...
echo '<br /><b>Начнем наш список с даты - '.$date.' по '.$date2.'</b><br />';

    $int_date = strtotime("$date GMT"); //Получаем дату выраженную типом int (кол-во секунд от 1970-01-01)
    $int_date2 = strtotime("$date2 GMT"); //Получаем дату выраженную типом int (кол-во секунд от 1970-01-01)  
      
        echo 'Количество секунд1 от базовой даты (01-01-1970) -- '.$int_date.' - '.gettype($int_date).'<br />';
        echo 'Количество секунд2 от базовой даты (01-01-1970) -- '.$int_date2.' - '.gettype($int_date2).'<br />';
      
    while ($int_date<=$int_date2)
    {

//Преобразуем число в дату....  
echo date("d-m-Y", $int_date).'<br />';

//Запись
$str = date("dmY", $int_date);
file_put_contents($file, $str."\n", FILE_APPEND | LOCK_EX);
  
//Для получения следующей даты прибавим +86400 (кол-во секунд в одних сутках)
$int_date = $int_date + 86400;  
    }
}
 Get_date_list('1989-01-01 00:00:00', '2013-01-01 00:00:00'); //От какой даты по какую...
?>

Результат работы скрипта:  

Аудит безопасности сайтов. Чтение файлов на сайте.

По мере разработки, в сфере Web-технологий, приходится сталкиваться с уязвимыми к атаке участкам кода. Например код найденный при аудите сайта. Данный код позволял загружать файлы PDF с сайта.
 Например:
 http://somehost.test/download.php?dir=DOCS&filename=test_doc_.pdf
Из-за недостаточной проверки входящих параметров dir и filename возможен выход за пределы  папки DOCS, что позволяет читать системные файлы, такие как php, ini и другие...

Уязвимый скрипт чтения файлов на сайте:

<?php
if(isset($_GET['dir'])){
    $newdir=$_GET['dir'];
    if(strstr($newdir, '.')){
        $fullPath = $newdir;
        if ($fd = fopen ($fullPath, "r")) {
            $fsize = filesize($fullPath);
            $path_parts = pathinfo($fullPath);
            $ext = strtolower($path_parts["extension"]);
            switch ($ext) {
                case "pdf":
                header("Content-type: application/pdf"); // add here more headers for diff. extensions
                header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
                break;
                default;
                header("Content-type: application/octet-stream");
                header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
            }
            header("Content-length: $fsize");
            header("Cache-control: private"); //use this to open files directly
            while(!feof($fd)) {
                $buffer = fread($fd, 2048);
                echo $buffer;
            }
        }
        fclose ($fd);
    }
}