SlideShare a Scribd company logo
1 of 100
Download to read offline
is_literal()
A proposed function for PHP
Craig Francis
is_literal()
To distinguish between safe strings,
which have been defined in your PHP script.
is_literal()
To distinguish between safe strings,
which have been defined in your PHP script.
VS unsafe strings,
which have been tainted by external sources.
The Problem
The Problem
The Problem
The Problem
Version 5.4.1
April 29, 2020
The Problem
Version 5.4.2
June 10, 2020
is_literal() is not the same as Taint Checking.
The Problem
Injection problems are rarely solved by Static Analysis.
The Problem
Injection problems are rarely solved by Static Analysis.
Still do use this.
The Problem
Injection problems are rarely solved by Static Analysis.
But it's hard to follow every variable from Source to Sink.
The Problem
Injection problems are rarely solved by Static Analysis.
And don't expect every programmer to use.
The Problem
$mysqli = new mysqli('localhost', 'test', '???', 'test');

$result = $mysqli->query('SELECT * FROM user WHERE id = ' . $_GET['id']);

if ($result instanceof mysqli_result) {

print_r($result->fetch_all());

}
Static Analysis
PHPStan
$mysqli = new mysqli('localhost', 'test', '???', 'test');

$id = (string) $_GET['id'];

$result = $mysqli->query('SELECT * FROM user WHERE id = ' . $id);

if ($result instanceof mysqli_result) {

print_r($result->fetch_all());

}
Static Analysis
Avoid MixedAssignment
Psalm
$mysqli = new mysqli('localhost', 'test', '???', 'test');

$id = (string) $_GET['id'];

$result = $mysqli->query('SELECT * FROM user WHERE id = ' . $id);

if ($result instanceof mysqli_result) {

print_r($result->fetch_all());

}
Static Analysis
Psalm,

Taint Analysis
I'm not using "mysqli_query()"

https://github.com/vimeo/psalm/issues/4155
Avoid MixedAssignment
Google engineer Christoph Kern, 2015:

https://www.usenix.org/conference/usenixsecurity15/symposium-program/
presentation/kern
Other Implementations
Google engineer Christoph Kern, 2015:

"Developer education doesn't solve the problem"
Other Implementations
Google engineer Christoph Kern, 2015:

"Bugs are hard to find after the fact"
Other Implementations
Google engineer Christoph Kern, 2015:

"Bugs are hard to find after the fact"
"Manual Testing, Automated Testing, Static Analysis, Human Code Reviews;

... will find some of these bugs..." @04:02
Other Implementations
Google have a similar solution in Go:

https://github.com/google/go-safeweb/tree/master/safehttp

https://blogtitle.github.io/go-safe-html/
Other Implementations
HTML Injection / XSS
By Roberto Clapis
Google have a similar solution in Go:

https://github.com/google/go-safeweb/tree/master/safesql

A Query Builder, with an Append() method that only accepts compile-time
constant strings (literal or const).
Other Implementations
SQL Injection
JavaScript may get a similar solution:

https://github.com/tc39/proposal-array-is-template-object

"Distinguishing strings from a trusted developer,

from strings that may be attacker controlled"
Other Implementations
Examples
Examples
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = 1')

	 ->getQuery()

	 ->getResult();
Doctrine QueryBuilder
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = ?1')

	 ->setParameter(1, $_GET['type_id'])

	 ->getQuery()

	 ->getResult();
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = 1')

	 ->getQuery()

	 ->getResult();
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = ' . $_GET['type_id'])

	 ->getQuery()

	 ->getResult();
Examples
Examples
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = 1')

	 ->getQuery()

	 ->getResult();
Safe String, a Literal
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = ' . $_GET['type_id'])

	 ->getQuery()

	 ->getResult();
Unsafe StringSafe String
Examples
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = ' . $_GET['type_id'])

	 ->getQuery()

	 ->getResult();
Examples
'WHERE u.type_id = u.type_id'
$sql = 'SELECT u FROM User u WHERE u.type_id = ' . $_GET['type_id'];

$query = $entityManager->createQuery($sql);
Doctrine - CreateQuery
Examples
$users = UserQuery::create()->where('type_id = ' . $_GET['type_id'])->find();
Propel ORM - Where
Examples
$result = R::find('user', 'type_id = ' . $_GET['type_id']);
RedBeanPHP - Find
Examples
$template = $twig->createTemplate('<p>Hello {{ name }}</p>');

echo $template->render(['name' => $_GET['name']]);
Examples Safe String, a Literal
$template = $twig->createTemplate('<p>Hello ' . $_GET['name'] . '</p>');

echo $template->render();
Examples Unsafe String
Examples
$output = shell_exec('ls /');
Safe String, a Literal
Examples
Examples
$output = shell_exec('ls ' . $_GET['path']);
Unsafe String
Taint Checking
https://pecl.php.net/package/taint
Taint Checking
$prefix = 'Hi ';

$welcome_html = $prefix . 'Name';
Taint Checking
$prefix = 'Hi ';

$welcome_html = $prefix . 'Name';
Untainted
Taint Checking
$prefix = 'Hi ';

$welcome_html = $prefix . 'Name';
Untainted
Untainted
Untainted
Taint Checking
$prefix = 'Hi ';

$welcome_html = $prefix . 'Name';
Untainted, Safe
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Tainted
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Untainted
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Untainted
Tainted
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . $name;
Tainted, not safe
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . htmlentities($name);
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . htmlentities($name);
Un-Taint
Taint Checking
$name = $_GET['name'];

$prefix = 'Hi ';

$welcome_html = $prefix . htmlentities($name);
Untainted, should be safe.
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
Tainted
Tainted
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
Tainted Tainted
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
Un-Taint Un-Taint
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
Untainted, surely this is safe?
Taint Checking
$url = $_GET['url'];

$name = $_GET['name'];

$link_html = '<a href="' . htmlentities($url) . '">' . htmlentities($name) . '</a>';
'javascript:alert("hi")'
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);
Tainted
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);
Untainted Un-Taint
Untainted, surely this is safe?
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);
Missing quotes
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);
"id"
Taint Checking
$sql .= 'WHERE id = ' . mysqli_real_escape_string($link, $_GET['id']);

$sql .= 'WHERE id = id';
"id"
Taint Checking
$img_html = '<img src=' . htmlentities($_GET['url']) . '>';
TaintedUntainted Untainted
Taint Checking
$img_html = '<img src=' . htmlentities($_GET['url']) . '>';
Un-Taint
Taint Checking
$img_html = '<img src=' . htmlentities($_GET['url']) . '>';
Untainted, surely this is safe?
Taint Checking
$img_html = '<img src=' . htmlentities($_GET['url']) . '>';
Missing quotes
Taint Checking
$img_html = '<img src=' . htmlentities($_GET['url']) . '>';

$img_html = '<img src=/ onerror=evil-js>';
"/ onerror=evil-js"
Taint Checking
How about character encoding issues?

The PDO Quote function clearly says it's only "theoretically safe".

https://www.php.net/pdo.quote
Summary
Do not mix safe strings (literals), with anything that may be attacker controlled.
Summary
We need a way to ensure this does not happen.
is_literal('This is a Literal');
is_literal('This is a Literal');
true
$a = 'This is a Literal';

is_literal($a);
true
$a = 'This is a Literal';

is_literal($a . 'And this');
true
$a = 'This is a Literal';

is_literal($a . $_GET['name']);
false
$a = 'This is a Literal';

is_literal($a . htmlentities($_GET['name']));
Still false
$a = 'This is a Literal';

is_literal($a . strtoupper('abc'));
Sorry, this is false - 'ABC' is no longer the string defined in the PHP script.
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = 1')

	 ->getQuery()

	 ->getResult();
Doctrine
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = 1')

	 ->getQuery()

	 ->getResult();
public function where($predicates)

{

if (!is_literal($predicates)) {

throw new Exception('Can only accept a literal');

}

...

}
Is a Safe Literal?
$users = $queryBuilder

	 ->select('u')

	 ->from('User', 'u')

	 ->where('u.type_id = ' . $_GET['type_id'])

	 ->getQuery()

	 ->getResult();
public function where($predicates)

{

if (!is_literal($predicates)) {

throw new Exception('Can only accept a literal');

}

...

}
Not a Safe Literal
$template = $twig->createTemplate('<p>Hello {{ name }}</p>');

echo $template->render(['name' => $_GET['name']]);
Twig
$template = $twig->createTemplate('<p>Hello {{ name }}</p>');

echo $template->render(['name' => $_GET['name']])

public function createTemplate(string $template, string $name = null): TemplateWrapper

{

if (!is_literal($template)) {

throw new Exception('Can only accept a literal');

}

...

}
Is a Safe Literal?
$template = $twig->createTemplate('<p>Hello ' . $_GET['name'] . '</p>');

echo $template->render()

public function createTemplate(string $template, string $name = null): TemplateWrapper

{

if (!is_literal($template)) {

throw new Exception('Can only accept a literal');

}

...

}
Not a Safe Literal
if (function_exists('is_literal') && !is_literal($a)) {

trigger_error('Can only accept a literal', E_USER_NOTICE);

}
Backwards compatibility
Notices might be safer for legacy projects.
if (!function_exists('is_literal')) {

function is_literal($variable) {

return true;

}

}
Backwards compatibility
$sql .= 'ORDER BY ' . $field_name;

What about Table and Field names?
$fields = [

'name',

'created',

'admin',

];

$field_id = array_search(($_GET['sort'] ?? 'created'), $fields);

$sql = ' ORDER BY ' . $fields[$field_id];
$sql .= 'WHERE id IN (1, 2, 3)';
What about WHERE IN?
$ids = [1, 2, 3];

$sql .= 'WHERE id IN (' . implode(', ', $ids) . ')';

From an unknown source
$ids = [1, 2, 3];

$sql .= 'WHERE id IN (' . implode(',', array_fill(0, count($ids), '?')) . ')';
$ids = [1, 2, 3];

$sql .= 'WHERE id IN (' . implode(',', array_fill(0, count($ids), '?')) . ')';

$sql .= 'WHERE id IN (?, ?, ?)';
https://wiki.php.net/rfc/is_literal

https://github.com/craigfrancis/php-is-literal-rfc
Thank You
Proposed PHP function: is_literal()

More Related Content

What's hot

Your code sucks, let's fix it
Your code sucks, let's fix itYour code sucks, let's fix it
Your code sucks, let's fix itRafael Dohms
 
Javascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introductionJavascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introductionIban Martinez
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...Rafael Dohms
 
Man in the Middle? - No, thank you!
Man in the Middle? - No, thank you!Man in the Middle? - No, thank you!
Man in the Middle? - No, thank you!Daniel Schneller
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2Kacper Gunia
 
Php Security By Mugdha And Anish
Php Security By Mugdha And AnishPhp Security By Mugdha And Anish
Php Security By Mugdha And AnishOSSCube
 
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"GeeksLab Odessa
 
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...GeeksLab Odessa
 
Error Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, loggingError Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, loggingSteve Maraspin
 
Coding for Scale and Sanity
Coding for Scale and SanityCoding for Scale and Sanity
Coding for Scale and SanityJimKellerES
 
Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6Riza Fahmi
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsClinton Dreisbach
 
Let's write secure Drupal code! - DrupalCamp London 2019
Let's write secure Drupal code! - DrupalCamp London 2019Let's write secure Drupal code! - DrupalCamp London 2019
Let's write secure Drupal code! - DrupalCamp London 2019Balázs Tatár
 
PHP security audits
PHP security auditsPHP security audits
PHP security auditsDamien Seguy
 
async/await Revisited
async/await Revisitedasync/await Revisited
async/await RevisitedRiza Fahmi
 
Implementing access control with zend framework
Implementing access control with zend frameworkImplementing access control with zend framework
Implementing access control with zend frameworkGeorge Mihailov
 
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Hacking Your Way To Better Security - Dutch PHP Conference 2016Hacking Your Way To Better Security - Dutch PHP Conference 2016
Hacking Your Way To Better Security - Dutch PHP Conference 2016Colin O'Dell
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHPGuilherme Blanco
 

What's hot (20)

Your code sucks, let's fix it
Your code sucks, let's fix itYour code sucks, let's fix it
Your code sucks, let's fix it
 
Javascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introductionJavascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introduction
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
Man in the Middle? - No, thank you!
Man in the Middle? - No, thank you!Man in the Middle? - No, thank you!
Man in the Middle? - No, thank you!
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2
 
Php Security By Mugdha And Anish
Php Security By Mugdha And AnishPhp Security By Mugdha And Anish
Php Security By Mugdha And Anish
 
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
 
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
 
Error Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, loggingError Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, logging
 
Coding for Scale and Sanity
Coding for Scale and SanityCoding for Scale and Sanity
Coding for Scale and Sanity
 
Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP Applications
 
jQuery introduction
jQuery introductionjQuery introduction
jQuery introduction
 
Let's write secure Drupal code! - DrupalCamp London 2019
Let's write secure Drupal code! - DrupalCamp London 2019Let's write secure Drupal code! - DrupalCamp London 2019
Let's write secure Drupal code! - DrupalCamp London 2019
 
PHP security audits
PHP security auditsPHP security audits
PHP security audits
 
async/await Revisited
async/await Revisitedasync/await Revisited
async/await Revisited
 
Implementing access control with zend framework
Implementing access control with zend frameworkImplementing access control with zend framework
Implementing access control with zend framework
 
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Hacking Your Way To Better Security - Dutch PHP Conference 2016Hacking Your Way To Better Security - Dutch PHP Conference 2016
Hacking Your Way To Better Security - Dutch PHP Conference 2016
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 

Similar to Proposed PHP function: is_literal()

Dip Your Toes in the Sea of Security (PHP Cambridge)
Dip Your Toes in the Sea of Security (PHP Cambridge)Dip Your Toes in the Sea of Security (PHP Cambridge)
Dip Your Toes in the Sea of Security (PHP Cambridge)James Titcumb
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersKacper Gunia
 
Jakość dostarczanego oprogramowania oparta o testy
Jakość dostarczanego oprogramowania oparta o testyJakość dostarczanego oprogramowania oparta o testy
Jakość dostarczanego oprogramowania oparta o testyPaweł Tekliński
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I thinkWim Godden
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksNate Abele
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using CodeceptionJeroen van Dijk
 
Dip Your Toes in the Sea of Security (DPC 2015)
Dip Your Toes in the Sea of Security (DPC 2015)Dip Your Toes in the Sea of Security (DPC 2015)
Dip Your Toes in the Sea of Security (DPC 2015)James Titcumb
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QAarchwisp
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Damien Seguy
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsBastian Feder
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmdiKlaus
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::ManagerJay Shirley
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I thinkWim Godden
 

Similar to Proposed PHP function: is_literal() (20)

Dip Your Toes in the Sea of Security (PHP Cambridge)
Dip Your Toes in the Sea of Security (PHP Cambridge)Dip Your Toes in the Sea of Security (PHP Cambridge)
Dip Your Toes in the Sea of Security (PHP Cambridge)
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
Separation of concerns - DPC12
Separation of concerns - DPC12Separation of concerns - DPC12
Separation of concerns - DPC12
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4Developers
 
Jakość dostarczanego oprogramowania oparta o testy
Jakość dostarczanego oprogramowania oparta o testyJakość dostarczanego oprogramowania oparta o testy
Jakość dostarczanego oprogramowania oparta o testy
 
Php Security
Php SecurityPhp Security
Php Security
 
PHP Secure Programming
PHP Secure ProgrammingPHP Secure Programming
PHP Secure Programming
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
php2.pptx
php2.pptxphp2.pptx
php2.pptx
 
Hooks WCSD12
Hooks WCSD12Hooks WCSD12
Hooks WCSD12
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
Dip Your Toes in the Sea of Security (DPC 2015)
Dip Your Toes in the Sea of Security (DPC 2015)Dip Your Toes in the Sea of Security (DPC 2015)
Dip Your Toes in the Sea of Security (DPC 2015)
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown Parts
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmd
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::Manager
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 

Recently uploaded

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 

Recently uploaded (20)

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 

Proposed PHP function: is_literal()