ID:               48906
 Updated by:       der...@php.net
 Reported By:      arno dot zandink at gmail dot com
-Status:           Open
+Status:           Bogus
 Bug Type:         Date/time related
 Operating System: *
 PHP Version:      5.3.0
 New Comment:

There is actually a warning already:

der...@kossu:~$ php
<?php
checkdate("01", "01", "1980 <script>alert('test');</script>");
?>

Notice: A non well formed numeric value encountered in /home/derick/-
on line 2

Call Stack:
    8.1010     653592   1. {main}() /home/derick/-:0
    8.1010     654376   2. checkdate(string(2), string(2), string(36))
/home/derick/-:2



Previous Comments:
------------------------------------------------------------------------

[2009-07-14 12:54:31] arno dot zandink at gmail dot com

ok, sounds logical indeed, the ticket can be closed in this case, I
only recommend to add a notice / warning / hint on the manual page
perhaps. To avoid that people use checkdate() and after that insert the
date directly into the database.

Thanks for the time

------------------------------------------------------------------------

[2009-07-14 11:14:52] sjoerd-php at linuxonly dot nl

The function checkdate() takes three integers as arguments. That means
that if you pass it a string, it will be cast to an int. The string
"1980 <script>alert('test');</script>" cast to an int will result in
1980.

So
checkdate("01", "01", "1980 <script>alert('test');</script>")
is equivalent to
checkdate(1, 1, 1980)

This is not a bug in PHP, rather a limitation of checkdate: it assumes
that you pass it numbers. You should check yourself that your input is
numeric.

------------------------------------------------------------------------

[2009-07-13 20:54:59] arno dot zandink at gmail dot com

hmm, indeed I changed my scripted at the last minute because I got a
deprecated notice.

My first test was as following:
<?php

$date = "01-01-1980 <script>alert('test');</script>";
$aDate_parts = split('-', $date);
print_r($aDate_parts);
var_dump(
    checkdate(
        $aDate_parts[1], // Month
        $aDate_parts[0], // Day
        $aDate_parts[2] // Year
    )
);

?>

This example will result in the following array:
<?php

Array
(
    [0] => 01
    [1] => 01
    [2] => 1980 <script>alert('test');</script>
)

?>

And it will return a boolean (true)

------------------------------------------------------------------------

[2009-07-13 19:49:18] sjoerd-php at linuxonly dot nl

Thank you for your bug report.

Your example code can be summarized as follows:
<?php var_dump(checkdate('01', '01', '1980')); ?>

I would expect this to return true, because January 1st 1980 is a valid
date. Why do you think it is an invalid date?

------------------------------------------------------------------------

[2009-07-13 19:11:20] arno dot zandink at gmail dot com

Description:
------------
checkdate returns true when the date given is not a valid date

If this is not considered a bug, perhaps adding a waring on the manual
page would be wise 

Reproduce code:
---------------
---
>From manual page: function.checkdate
---
<?php

$date = "01-01-1980 <script>alert('test');</script>";
$aDate_parts = preg_split("/[\s-]+/", $date);

var_dump(
    checkdate(
        $aDate_parts[1], // Month
        $aDate_parts[0], // Day
        $aDate_parts[2] // Year
    )
);

?>

Expected result:
----------------
I would expect var_dump to print a boolean (false) because the date is
not valid

Actual result:
--------------
A boolean (true) is returned with a invalid date


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=48906&edit=1

Reply via email to