小编JM4*_*JM4的帖子

在会话中存储信用卡号码 - 围绕它的方式?

我非常了解PCI合规性,因此在结账过程中我们不需要在公司数据库中存储CC号码(特别是CVV号码).

但是,我希望在处理敏感的消费者信息时尽可能安全,并且好奇如何在不使用SESSION变量的情况下绕过页面传递CC号码.

我的网站以这种方式构建:

  1. 步骤1)从客户收集信用卡信息 - 当客户点击提交时,信息首先通过JS验证运行,然后通过PHP验证运行,如果所有通过他转到步骤2.
  2. 步骤2)信息显示在客户的评论页面上,以确保显示他们即将进行的交易的详细信息.此页面仅显示CC的前6个和后4个,但卡类型和exp日期完全是shwon.如果他点击继续,
  3. 步骤3)将信息发送到另一个运行最后一次验证的php页面,通过安全支付网关发送信息,并返回带有详细信息的字符串.
  4. 步骤4)如果一切顺利,消费者信息(个人信息,而不是CC)存储在数据库中并重定向到完成页面.如果有什么不好的话,他会被告知并重新访问CC处理页面再试一次(最多3次).

有什么建议?

编辑

我在这个问题上得到了很多非常好的回应 - 大多数人似乎同意以下几点:

  1. 运行验证后获取POST变量
  2. 加密ccnum和cvv(不确定你是否可以将cvv存储在DB中)
  3. 存储在临时DB中
  4. 在"审核"页面之后立即访问数据库是可以的
  5. 从DB解密细节
  6. 向处理器发送信息
  7. 收到回应
  8. 终止DB

我认为这总体上是有道理的.有没有人有好的加密/解密方法以及创建临时数据库信息的最佳方法,这些信息会在以后的呼叫中自动删除?

我在PHP和MySQL DB编程

编辑#2

我遇到了Packet General,这似乎是一个理想的解决方案,但真的不想支付另一个软件许可证来实现这个目标. http://www.packetgeneral.com/pcigeneralformysql.html

编辑#3 - 示例代码

我现在已经发布了一些示例代码,我将这些代码放在一起,试图理解本文中提到的加密/解密/密钥和存储.希望已经有用的贡献者可以验证,其他人可以使用类似的功能.为了长度,我不会讨论用于实际CC num本身的验证方法.

表格输入

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="text" name="CC" />
<input type="text" name="CVV" />
<input type="text" name="CardType" />
<input type="text" name="NameOnCard" />
<input type="submit" name="submit" value="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

PHP加密和存储数据

<?php

$ivs = mcrypt_get_iv_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivs,MCRYPT_RAND);
$key = "1234"; //not sure what best way to generate …
Run Code Online (Sandbox Code Playgroud)

php mysql session credit-card

38
推荐指数
4
解决办法
1万
查看次数

你能在ORDER BY中添加一个if语句吗?

我想要实现以下目标:

我有一个ORDER BY语句,它可能会根据存储在A列中的值而有所不同.

例如:

如果Type为Member,如果Type为Group,则按成员姓氏排序,按Group Name排序

都按升序排列.

我对最终陈述的最佳猜测是:

SELECT * 
  FROM table 
 WHERE STATUS = 'Active' 
 ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC
Run Code Online (Sandbox Code Playgroud)

我知道这是不正确的,但无法在其他地方找到信息.有任何想法吗?

php mysql sorting

35
推荐指数
2
解决办法
5万
查看次数

在PHP中写入文本文件时,换行符不起作用

我有以下测试脚本:

<?php

$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = "Floppy Jalopy\n";
fwrite($fh, $stringData);
$stringData = "Pointy Pinto\n";
fwrite($fh, $stringData);
fclose($fh);

?>
Run Code Online (Sandbox Code Playgroud)

然而,当运行并打开usign记事本时,数据将在一行中返回而不会中断:

软盘Jalopy(疯狂的盒子)Pointy Pinto(疯狂的盒子)

我无法找到"疯狂的盒子"的合适角色,但它是一个非常疯狂的盒子.是什么赋予了!

php fopen fwrite text-files

29
推荐指数
2
解决办法
5万
查看次数

PHP'年'阵列

我正在尝试创建一个阵列多年,我将在我正在构建的表格的DOB年份中使用.目前,我知道有两种方法可以解决这个问题但我并不关心:

1)范围:

我知道我可以使用以下内容创建年份数组

<?php 
     $year = range(1910,date("Y"));
     $_SESSION['years_arr'] = $year;
?>
Run Code Online (Sandbox Code Playgroud)

第1点的问题有两个方面:a)我的函数调用将第一年显示为"选定"而不是"年",因为我有选项="0",而b)我希望年份逆转所以2010年是第一年至少并显示减少.

我的函数调用是:

PHP

<?php
    function showOptionsDrop($array, $active, $echo=true){
        $string = '';

        foreach($array as $k => $v){
            $s = ($active == $k)? ' selected="selected"' : '';
            $string .= '<option value="'.$k.'"'.$s.'>'.$v.'</option>'."\n";     
        }

        if($echo)   echo $string;
        else        return $string;
    }
?>
Run Code Online (Sandbox Code Playgroud)

HTML

<table>
            <tr>
            <td>State:</td>
            <td><select name="F1State"><option value="0">Choose a year</option><?php showOptionsDrop($_SESSION['years_arr'], null, true); ?></select>
            </td>
            </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

2)长阵列

我知道我可以在物理上创建一个列出多年的数组,但是如果我想回去修改它会占用大量的空间和时间.

例如:PHP

$years = array('1900'=>"1900", '1901'=>"1901", '1902'=>"1902", '1903'=>"1903", '1904'=>"1904", '1905'=>"1905", '1906'=>"1906", '1907'=>"1907", '1908'=>"1908", …
Run Code Online (Sandbox Code Playgroud)

php arrays date

22
推荐指数
2
解决办法
3万
查看次数

为什么mysqli给出"命令不同步"错误?

我正在尝试运行以下内容.

<?php

$db = mysqli_connect("localhost","user","pw") or die("Database error");
mysqli_select_db($db, "database");

$agtid = $_POST['level'];

$sql = sprintf("call agent_hier(%d)", $agtid);

$result = mysqli_query($db, $sql) or exit(mysqli_error($db));

if ($result) {
    echo "<table border='1'>
        <tr><th>id</th>
        <th>name</th>
        <th>parent_id</th>
        <th>parent_name</th>
        <th>level</th>
        <th>email</th></tr>";

    while ($row = mysqli_fetch_assoc($result)) 
    {
        $aid = $row["id"];
        $sql2 = "SELECT * FROM members WHERE MEMNO = '$aid'";
        $result2 = mysqli_query($db,$sql2) or exit(mysqli_error($db));

            while ($newArray = mysqli_fetch_array($result2)) {
                $fname = $newArray['FNAME'];
                $lname = $newArray['LNAME'];
                $mi = $newArray['MI'];  
                $address = $newArray['ADDRESS'];    
                $city = $newArray['CITY'];  
                $state …
Run Code Online (Sandbox Code Playgroud)

php mysql mysqli

21
推荐指数
1
解决办法
4万
查看次数

浏览器关闭前提示用户?

我们有一个管理门户,在注销和/或关闭浏览器窗口之前,我们的老师经常忘记下载最新的PDF说明.我环顾四周但找不到我要找的东西.

我想实现以下目标:

目标1

在用户关闭浏览器窗口之前,系统会提示"您还记得下载表单吗?" 有两个选项,是/否.如果是,请关闭,否则返回页面.

目标2

在用户单击"注销"按钮之前,系统会提示它们与上面相同.

我在第一次使用非常基本的代码(不适用于浏览器关闭)是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>

<script type="text/javascript">
function init() {
    if (window.addEventListener) {
        window.addEventListener("beforeunload", unloadMess, false);
    } else if (window.onbeforeunload) {
        window.onbeforeunload = unloadMess;
    };
}

function unloadMess() {
    var User_Message = "[Your user message here]"
    return User_Message;
}
</script>
</head>

<body onload="init();">
     hello this is my site
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

编辑 - 新问题

下面提供的解决方案有效,但也有自己的问题:

当用户单击实际下载表单的链接时,该页面认为他们正试图离开并反过来向他们显示错误消息!此外 - 我希望一个或另一个事件发生,但不一定两者都发生.即他们点击"注销"按钮,他们会看到OnClick事件,然后是浏览器提示.有任何想法吗?

javascript popup browser-close

18
推荐指数
1
解决办法
4万
查看次数

如何使用PHP和PDO将数组插入到单个MySQL Prepared语句中

在线注册期间,客户可以选择他们选择注册的多个节目.这些程序是三位整数,存储在一个数组中.

例如:

我想加入programid 155,165,175和185.

我的数组设置简单如下:

$data = array();

$data[] = 155;

$data[] = 165;

$data[] = 175;

$data[] = 185;
Run Code Online (Sandbox Code Playgroud)

当需要将此信息插入关联表时,我还会在注册的其他部分中包含其他元素:

例如,如果我正在执行SINGLE程序插入语句,它将如下所示:

$stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
$stmt->execute(array($memberid, 155));
Run Code Online (Sandbox Code Playgroud)

我通常会为上面的数组创建一个简单的循环,它将调用sql语句的多个实例并执行如下:

for($j = 0; $j < (count($data)-1); $j++) {
   $stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
   $stmt->execute(array($memberid, $data[$j]));
}
Run Code Online (Sandbox Code Playgroud)

我确实意识到上面的代码是无效的($ data [$ j])但是正在寻找正确的方式来进行调用.

我之前也被告知,构建单个动态sql语句总体上比上面的多个调用要好.我的第一次传球将是这样的:

$sql = array(); 
foreach( $data as $row ) {
    $sql[] = '("'.$memberid.'", "'.$row[$j].'", NOW()")';
}
mysql_real_query('INSERT INTO table (memberid, programid) VALUES …
Run Code Online (Sandbox Code Playgroud)

php mysql pdo loops

16
推荐指数
2
解决办法
4万
查看次数

HTTPS连接是否禁用了jQuery?

我有以下PHP脚本在正常情况下完美无缺(即直接访问页面):

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="css/contact_search.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.watermarkinput.js"></script>
<script type="text/javascript">
$(document).ready(function() {

$(document).click(function() {
    $("#display").hide();
});

var cache = {};

    $("#searchbox").keyup(function() {
        var searchbox = $(this).val();
        var dataString = 'searchword=' + searchbox;

        if (searchbox.length < 3 ) {
            $("#display").hide();
            } else {

            $.ajax({
                type: "POST",
                url: "contact_search/search.php",
                data: dataString,
                cache: false,
                success: function(html) { …
Run Code Online (Sandbox Code Playgroud)

javascript php https jquery

12
推荐指数
1
解决办法
737
查看次数

FPDF.php的文件大小比TCPDF.php小20倍?为什么?

我知道有很多关于这两个的帖子,但我想我会解决一个明显的问题.我们的一位设计师最近给我发了一些TCPDF的文件,因为他的朋友说它"更好".

在过去,我们使用FPDF来完成PHP中的所有PDF生成,但是我发现了一个巨大的明显区别:

fpdf.php的文件大小:46KB

tcpdf.php的文件大小:996 KB

注意:上面的文件大小是实际的php文件,而不是PDF的生成.

我真的没有太多的耐心坐下来看看两者之间的所有差异,但似乎不值得切换真正的巨大文件差异.SO上的大多数人似乎都非常喜欢TCPDF,但是给出了什么呢?

主要问题

为什么大小不同,我应该担心我的服务器每天要加载1MB文件数百或数千次,而50KB文件几乎完全相同?我不是说我的PDF文件更大.PHP脚本本身的文件大小为1MB到40Kb.

php pdf pdf-generation fpdf tcpdf

10
推荐指数
2
解决办法
6107
查看次数

为什么你不能将MYSQL函数传递给准备好的PDO语句?

在我看来,以下脚本应该工作:

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = ?");
$stmt->execute(array(1, 'NOW()'));
Run Code Online (Sandbox Code Playgroud)

但是当NOW()进入准备好的陈述时,没有任何反应.替换NOW()为实际日期(即2010-11-23)工作正常.

我无法在网上找到解释.有任何想法吗?

编辑

为了进一步澄清和消除问题中的任何混淆,我想实际将一个变量传递给预备语句HOWEVER,该变量将被设置为mysql的五个可能的日期/时间函数之一.

例如

$ var ='NOW()';

$ var ='LAST_DAY(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))';

$ var ='LAST_DAY(CURDATE())';

... 等等...

准备好的声明变成:

$stmt->execute(array(1, $var));
Run Code Online (Sandbox Code Playgroud)

我知道这将返回相同的NULL结果,但我担心如果我只是将sql语句更改为:

UPDATE表SET状态=?,date_modified = $ var

我打开自己注射?

php mysql pdo prepared-statement

9
推荐指数
2
解决办法
7488
查看次数