我非常了解PCI合规性,因此在结账过程中我们不需要在公司数据库中存储CC号码(特别是CVV号码).
但是,我希望在处理敏感的消费者信息时尽可能安全,并且好奇如何在不使用SESSION变量的情况下绕过页面传递CC号码.
我的网站以这种方式构建:
有什么建议?
我在这个问题上得到了很多非常好的回应 - 大多数人似乎同意以下几点:
我认为这总体上是有道理的.有没有人有好的加密/解密方法以及创建临时数据库信息的最佳方法,这些信息会在以后的呼叫中自动删除?
我在PHP和MySQL DB编程
我遇到了Packet General,这似乎是一个理想的解决方案,但真的不想支付另一个软件许可证来实现这个目标.
http://www.packetgeneral.com/pcigeneralformysql.html
我现在已经发布了一些示例代码,我将这些代码放在一起,试图理解本文中提到的加密/解密/密钥和存储.希望已经有用的贡献者可以验证,其他人可以使用类似的功能.为了长度,我不会讨论用于实际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
$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) 我想要实现以下目标:
我有一个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
$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(疯狂的盒子)
我无法找到"疯狂的盒子"的合适角色,但它是一个非常疯狂的盒子.是什么赋予了!
我正在尝试创建一个阵列多年,我将在我正在构建的表格的DOB年份中使用.目前,我知道有两种方法可以解决这个问题但我并不关心:
我知道我可以使用以下内容创建年份数组
<?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)
我知道我可以在物理上创建一个列出多年的数组,但是如果我想回去修改它会占用大量的空间和时间.
例如: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
$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) 我们有一个管理门户,在注销和/或关闭浏览器窗口之前,我们的老师经常忘记下载最新的PDF说明.我环顾四周但找不到我要找的东西.
我想实现以下目标:
在用户关闭浏览器窗口之前,系统会提示"您还记得下载表单吗?" 有两个选项,是/否.如果是,请关闭,否则返回页面.
在用户单击"注销"按钮之前,系统会提示它们与上面相同.
我在第一次使用非常基本的代码(不适用于浏览器关闭)是:
<!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事件,然后是浏览器提示.有任何想法吗?
在线注册期间,客户可以选择他们选择注册的多个节目.这些程序是三位整数,存储在一个数组中.
例如:
我想加入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脚本在正常情况下完美无缺(即直接访问页面):
<!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) 我知道有很多关于这两个的帖子,但我想我会解决一个明显的问题.我们的一位设计师最近给我发了一些TCPDF的文件,因为他的朋友说它"更好".
在过去,我们使用FPDF来完成PHP中的所有PDF生成,但是我发现了一个巨大的明显区别:
fpdf.php的文件大小:46KB
tcpdf.php的文件大小:996 KB
注意:上面的文件大小是实际的php文件,而不是PDF的生成.
我真的没有太多的耐心坐下来看看两者之间的所有差异,但似乎不值得切换真正的巨大文件差异.SO上的大多数人似乎都非常喜欢TCPDF,但是给出了什么呢?
为什么大小不同,我应该担心我的服务器每天要加载1MB文件数百或数千次,而50KB文件几乎完全相同?我不是说我的PDF文件更大.PHP脚本本身的文件大小为1MB到40Kb.
在我看来,以下脚本应该工作:
$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
我打开自己注射?