PHP Password generator extension
Και το αντίστοιχο password generator σε php extension για να υπάρχει παντού διαθέσιμο χωρίς να χρειάζεται includes και copy/paste, αλλά και να είναι λίγο ή πολύ πιο γρήγορο από την αντίστοιχη function.
Δημιουργούμε ένα νέο φάκελο passwd και εκεί μέσα δημιουργούμε τα εξής αρχεία:
config.m4
PHP_ARG_ENABLE(passwd, whether to enable passwd support, [ --enable-passwd Enable passwd support])
if test "$PHP_PASSWD" = "yes"; then
AC_DEFINE(HAVE_PASSWD, 1, [Whether you have passwd])
PHP_NEW_EXTENSION(passwd, passwd.c, $ext_shared)
fi
INC_CHECK_DIRS="/usr /usr/local"
for i in $INC_CHECK_DIRS ; do
if test -f $i/include/php/ext/standard/php_rand.h; then
PHP_ADD_INCLUDE($i/include/php/ext/standard)
break
fi
done
passwd.h
#ifndef __PASSWD_H__ #define __PASSWD_H__ 1 #ifndef _WIN32 #include #endif #include #ifdef ZTS #include "TSRM.h" #endif #ifndef BOOL #define BOOL short #endif //BOOL #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (1) #endif #define PHP_PASSWD_WORLD_VERSION "1.0.0" #define PHP_PASSWD_WORLD_EXTNAME "passwd" PHP_FUNCTION(passwd_version); PHP_FUNCTION(passwd_create); PHP_MINIT_FUNCTION(passwd); PHP_MINFO_FUNCTION(passwd); extern zend_module_entry passwd_module_entry; #define phpext_passwd_ptr &passwd_module_entry #endif //__PASSWD_H__
passwd.c
#include "php.h"
#include "php_rand.h"
#ifdef _WIN32
#include "ext/standard/info.h"
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "passwd.h"
#ifndef LONG
typedef long LONG;
#endif
static function_entry passwd_functions[] = {
PHP_FE(passwd_version, NULL)
PHP_FE(passwd_create, NULL)
{NULL, NULL, NULL}
};
zend_module_entry passwd_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_PASSWD_WORLD_EXTNAME,
passwd_functions,
PHP_MINIT(passwd),
NULL,
NULL,
NULL,
PHP_MINFO(passwd),
#if ZEND_MODULE_API_NO >= 20010901
PHP_PASSWD_WORLD_VERSION,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_PASSWD
ZEND_GET_MODULE(passwd)
#endif
char* passwordChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-_=+[]{}\\|,<.>/?~;:";
int passwordCharsLen = 0;
static void ZEND_MODULE_GLOBALS_CTOR_N(passwd)(void *passwd_globals TSRMLS_DC)
{
//php_srand( time(NULL) );
}
PHP_MINIT_FUNCTION(passwd)
{
passwordCharsLen = strlen(passwordChars);
return SUCCESS;
}
PHP_MINFO_FUNCTION(passwd)
{
php_info_print_table_start();
php_info_print_table_row(2, "passwd", "passwd Functions");
php_info_print_table_row(2, "passwd_create", "return a random password string");
php_info_print_table_end();
}
PHP_FUNCTION(passwd_version)
{
RETURN_STRING(PHP_PASSWD_WORLD_VERSION, 1);
}
PHP_FUNCTION(passwd_create)
{
long i, llen, rnd_idx;
char* tmp;
if (ZEND_NUM_ARGS() != 1) {
WRONG_PARAM_COUNT;
}
llen = 8;
if ((zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &llen) == FAILURE) ||
(llen < 4) || (llen > 128))
{
RETURN_STRING("len should be an integer between 4 and 128", 1);
}
tmp = emalloc(llen+1);
for (i=0; i<llen; i++)
{
rnd_idx = php_rand(TSRMLS_C);
RAND_RANGE(rnd_idx, 0, passwordCharsLen-1, PHP_RAND_MAX);
tmp[i] = passwordChars[rnd_idx];
}
tmp[i]=(char)0;
RETURN_STRING(tmp, 0);
}
Τώρα o αντίστοιχος κώδικας του σχετικού post θα μπορούσε να γίνει ως εξής:
<?php
header('Content-type: text/plain');
if (isset($_GET['len'])) $len = (int)$_GET['len'];
if (($len < 4) || ($len > 128)) $len = 8;
echo passwd_create($len);
?>
PHP password generator
Χρειάστηκα σήμερα έναν password generator, γιατί ήθελα να δώσω passwords σε μια λίστα από emails που έφτιαχνα, και δεν μου πέρασε καν απο το μυαλό ότι το συγκεκριμένο το έχουν χρειαστεί χιλιάδες πριν από μένα. Οπότε ξεκίνησα να γράφω κώδικα και ιδού:
<?php
header('Content-type: text/plain');
function generatePassword($len)
{
$passwordChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-_=+[]{}\\|,<.>/?`~;:';
$passwordCharsLen = strlen($passwordChars);
$tmp = '';
for ($i=0; $i < $len; $i++)
{
$x = rand(1, $passwordCharsLen);
$tmp .= $passwordChars[$x-1];
}
return $tmp;
}
if (isset($_GET['len'])) $len = (int)$_GET['len'];
if (($len < 4) || ($len > 128)) $len = 8;
echo generatePassword($len);
?>
Ισως βέβαια το να έψαχνα και να δοκίμαζα τι δουλεύει και τι όχι να μου έπαιρνε περισσότερο χρόνο απ΄ όσο μου πήρε να κάτσω να το γράψω μόνος μου, αλλά δεν πρόκειται να το μάθω ποτέ…
Αριθμοί Κυκλοφορίας
Μια απλή κλάση που τροποποιεί τους αριθμούς κυκλοφορίας ώστε να μείνουν μόνο οι επιτρεπτοί χαρακτήρες για τους αριθμούς κυκλοφορίας στις ελληνικές πινακίδες. Οι ελληνικοί χαρακτήρες που δεν υπάρχουν στο λατινικό αλφάβητο αφαιρούνται, και όσοι μένουν μετατρέπονται στον αντίστοιχο (οπτικά) λατινικό χαρακτήρα.
Οι λατινικοί μένουν όπως είναι, αφού αφορούν πινακίδες ξένων κρατών.
Αν τώρα υπάρχουν πινακίδες με αραβικά γράμματα, ταϊλανδέζικα, κινέζικα, κ.λπ. δεν έχω δει, οπότε κάνουμε τον κινέζο.
Ανάγνωση του υπολοίπου…