Category: General

This blog has moved

I have consolidated my personal blog with this Emerging Tech in Libraries blog, since there’s a lot of overlap. I’ll still be active around the CUNY Academic Commons, but as for blogging, it will be easier for me to see all my writing in one place:

robincamille.com »

All blog posts and comments will remain up here. The posts (but not the comments) have also been migrated to my personal site, which now runs on Jekyll (yay!).

What did I do this year? 2016-17 edition

word cloud prominently featuring refdesk, email, prep, chat, teaching, workshops

Every year, I take all of my “Done” tasks in my daily work log, normalize them, and run them through a word cloud visualizer to see what I’ve been spending my time doing. This helps me as I write my annual self-evaluation and generally reflect on how I should spend my time in the coming year. It doesn’t have a lot of nuance, though — things that repeat a lot are bigger, even if they don’t loom large in my head.

This year’s word cloud similar to last year’s in that I spent time on regularly occurring activities, such as staffing the Reference Desk and reference chat, being in meetings, emailing people, and teaching/prepping for teaching.

Things I focused on this year especially

  • researchleave — this was my first year on the tenure track, and I spent about 4 days a month on RL, which is granted to junior faculty members at CUNY. I spent most of that time gathering data for a web preservation survey project, learning new tech skills for use in an NLP project, writing my Internet Connection column, and writing proposals (my PSC-CUNY grant proposal was accepted!).
  • drupal, mockupupdate, usability, and webcommittee — our library website just underwent an interface update 7 months in the making. I chaired the library’s Web Committee, made mock-ups, gathered feedback, designed and moderated usability tests, and implemented UI/UX changes on our Drupal site. I also updated a lot of content and promotional materials on the website, a continuous job.
  • workshops — I’ve come to realize that running workshops is one of my favorite professional activities. Library basics, Python skills, teaching tips — I love it! I ran a handful of workshops this year aimed at students and at faculty, such as my very well-attended “Privacy tips & tools” workshop.
  • socialmedia — it’s extra-big in the cloud because I noted this whenever I made a post, which was more often than before. Several other librarians and I share the Twitter and Facebook accounts; I run our Instagram presence, which I’ve focused on growing. Though spotty over the summer, @johnjaylibrary on Instagram gained 112 new followers, and I created 87 posts over the year. (At first, most of our followers were other libraries. Now they seem to be mostly John Jay students!)
  • oer — I spent a fair amount of time this year reading up on Open Educational Resources, before and after attending OER17 in London.
  • teachingandlearningcenter — I was part of a year-long, very good “Online/digital teaching” seminar at John Jay’s TLC.

Things to do more of next year

In 2017-18, my intention is to use my research leave time better and more productively. I’ve gotten better at time management in the office (see: the rising prominence of “prep” in these annual word clouds), but I need to build up better habits on my own time, too, as I work on my solo projects. This might also point to a need to collaborate more with other scholars/practitioners — I’m at my best and most productive when working on a team.

Looking again at last year’s “What did I do this year?”, I see that I’d intended to carve out more time for reading. I did do some of that during my research leave, but I have to be a lot more intentional about it or I’ll just focus on hands-on activities.

I also plan to spend more time on professional development, such as improving my JavaScript skills and attending/presenting at more conferences. I think I got conference burn-out last year, but now I miss it. Time to jump back in.

What did I do this year? 2015–16 edition

word cloud

I jump-start my annual self-evaluation process with a low-level text analysis of my work log, essentially composed of “done” and “to do” bullet points. I normalized the text (e.g. emailed to email and Digital Collections to digitalcollections), removed personal names, and ran the all “done” items through Wordle.

2015–16 was my fourth year in my job and the fourth time I did this. (See 2012–13, 2013–14, and 2014–15). I do this because it can be difficult to remember what I was up to many months ago. It’s also a basic visualization of where my time is spent. The more an item is mentioned, the more days I worked on it for at least an hour or so. (Which may be misleading — I think I spent more hours on teaching and prep for teaching, but because I staffed the ref desk for a short shift on more days, “refdesk” appears larger.)

What did I do at my job this year?

  • teaching: I taught a library instruction session (“one-shot”) in 16 on-campus classes and 5 online classes. I taught twice as many classes as I did last year.
  • embedded: For each online class, I was embedded in the Blackboard course for a full week, posting material and answering questions in the forum. (See my post about this.)
  • socialmedia: I post things on Twitter and Facebook, along with several colleagues. I run the Instagram account all by me onesy.
  • bssl: I published four columns in Behavioral & Social Sciences Librarian. (See all.)
  • murdermystery: I ran this super-fun activity in the spring semester and began preparing for a summer session.
  • refdesk: I staffed the Reference Desk for 105 hours.
  • chat: I staffed chat and SMS for 77 hours. (I replaced “chatted with X” with “meeting” to disambiguate.)
  • drupal, digitalcollections, and onesearch: Worked on web stuff that runs the library websites.

I also emailed a lot and had a lot of meetings. What’s also interesting is how much I used the word prep. This is often related in the work log to teaching, and I did teach double the number of classes I taught last year. But I think it also reflects an improvement in my time management skills!

I am also trying really hard to carve out more time for reading. At work, I mostly read articles and blogs related to the intersection of technology and library practices, with a healthy dose of DH and privacy activism.

Invisible spam pages on our website: how we locked out a hacker

TL;DR: A hacker uploaded a fake JPG file containing PHP code that generated “invisible” spam blog posts on our website. To avoid this happening to you, block inactive accounts in Drupal and monitor Google Search Console reports.

I noticed something odd on the library website the other day: a search of our site displayed a ton of spam in the Google Custom Search Engine (CSE) results.

google CSE spam

But when I clicked on the links for those supposed blog posts, I’d get a 404 Page Not Found error. It was like these spammy blog posts didn’t seem to exist except for in search results. I thought this was some kind of fake-URL generation visible just in the CSE (similar to fake referral URLs in Analytics), but regular Google was seeing these spammy blog posts as being on our site as well if I searched for an exact title.

spam results on google after searching for exact spam title

Still, Google was “seeing” these blog posts that kept netting 404 errors. I looked at the cached page, however, and saw that Google had indexed what looked like an actual page on our site, complete with the menu options.

cached page displaying spam text next to actual site text

Cloaked URLs

Not knowing much more, I had to assume that there were two versions of these spam blog posts: the ones humans saw when they clicked on a link, and the ones that Google saw when its bots indexed the page. After some light research, I found that this is called “cloaking.” Google does not like this, and I eventually received an email from Webmaster Tools with the subject “Hacked content detected.”

It was at this point that we alerted the IT department at our college to let them know there was a problem and that we were working on it (we run our own servers).

Finding the point of entry

Now I had to figure out if there was actually content being injected into our site. Nothing about the website looked different, and Drupal did not list any new pages, but someone was posting invisible content, purely to show up in Google’s search results and build some kind of network of spam content. Another suspicious thing: these URLs contained /blogs/, but our actual blog posts have URLs with /blog/, suggesting spoofed content. In Drupal, I looked at all the reports and logs I could find. Under the People menu, I noticed that 1 week ago, someone had signed into the site with a username for a former consultant who hadn’t worked on the site in two years.

Inactive account had signed in 1 week, 4 days ago

Yikes. So it looks like someone had hacked into an old, inactive admin account. I emailed our consultant and asked if they’d happened to sign in, and they replied Nope, and added that they didn’t even like Nikes. Hmm.

So I blocked that account, as well as accounts that hadn’t been used within the past year. I also reset everyone’s passwords and recommended they follow my tips for building a memorable and hard-to-hack password.

Clues from Google Search Console

The spammy content was still online. Just as I was investigating the problem, I got this mysterious message in my inbox from Google Search Console (SC). Background: In SC, site owners can set preferences for how their site appears in Google search results and track things like how many other websites like to their website. There’s no ability to change the content; it’s mostly a monitoring site.

reconsideration request from google

I didn’t write that reconsideration request. Neither did our webmaster, Mandy, or anybody who would have access to the Search Console. Lo and behold, the hacker had claimed site ownership in the Search Console:

madlife520 is listed as a site owner in google search console

Now our hacker had a name: Madlife520. (Cool username, bro!) And they’d signed up for SC, probably because they wanted stats for how well their spam posts were doing and to reassure Google that the content was legit.

But Search Console wouldn’t let me un-verify Madlife520 as a site owner. To be a verified site owner, you can upload a special HTML file they provide to your website, with the idea that only a true site owner would be able to do that.

google alert: cannot un-verify as HTML file is still there. FTP client window: HTML file is NOT there.

But here’s where I felt truly crazy. Google said Madlife520’s verification file was still online. But we couldn’t find it! The only verification file was mine (ending in c12.html, not fd1.html). Another invisible file. What was going on? Why couldn’t we see what Google could see?

Finding malicious code

Geng, our whipsmart systems manager, did a full-text search of the files on our server and found the text string google4a4…fd1.html in the contents of a JPG file in …/private/default_images/. Yep, not the actual HTML file itself, but a line in a JPG file. Files in /private/ are usually images uploaded to our slideshow or syllabi that professors send through our schedule-a-class webform — files submitted through Drupal, not uploaded directly to the server.

So it looks like this: Madlife520 had logged into Drupal with an inactive account and uploaded a text file with a .JPG extension to a module or form (not sure where yet). This text file contained PHP code that dictated that if Google or other search engines asked for the URL of these spam blog posts, the site would serve up spammy content from another website; if a person clicked on that URL, it would display a 404 Page Not Found page. Moreover, this PHP code spoofed the Google Search Console verification file, making Google think it was there when it actually wasn’t. All of this was done very subtly — aside from weird search results, nothing on the site looked or felt differently, probably in the hope that we wouldn’t notice anything unusual so the spam could stay up for as long as possible.

Steps taken to lock out the hacker

Geng saved a local file of the PHP code, then deleted it from the server. He also made the subdirectory they were in read-only. Mandy, our webmaster, installed the Honeypot module in Drupal, which adds an invisible “URL: ___” field to all webforms that bots will keep trying to fill without ever successfully logging in or submitting a form, in case that might prevent password-cracking software. On my end, I blocked all inactive Drupal accounts, reset all passwords, unverified Madlife520 from Search Console, and blocked IPs that had attempted to access our site a suspiciously high number of times (these IPs were all in a block located in the Netherlands, oddly).

At this point, Google is still suspicious of our site:

"This site may be hacked" warning beneath Lloyd Sealy Library search result

But I submitted a Reconsideration Request through Search Console — this time, actually written by me.

And it seems that the spammy content is no longer accessible, and we’re seeing far fewer link clicks on our website than before these actions.

marked increase, then decrease in clicked links to our site

I’m happy that we were able to curb the spam and (we hope) lock out the hacker in just over a week, all during winter break when our legitimate traffic is low. We’re continuing to monitor all the pulse points of our site, since we don’t know for sure there isn’t other malicious code somewhere.

I posted this in case someone, somewhere, is in their office on a Friday at 5pm, frantically googling invisible posts drupal spam urls 404??? like I was. If you are, good luck!

What did I do this year? 2014–15 edition

librarian word cloud

I jump-start my annual self-evaluation process with a low-level text analysis of my work log, essentially composed of “done” and “to do” bullet points. I normalized the text (e.g. emailed to email), removed personal names, and ran the all “done” items through Wordle.

2014–15 was my third year in my job and the third time I did this. (See 2012–13 and 2013–14). I do this because it can be difficult to remember what I was up to many months ago. It’s also a basic visualization of where my time is spent.

What did I do at my job this year?

Aside from the usual meetings, emails, and Reference Desk duties…

  • chat: I implemented a chat reference service with my colleagues (this had been tried before on this campus, but with subpar software and bad staffing experiences; this time, we have limited hours and are very happy with LibraryH3lp)
  • 50th: I worked on a physical and digital exhibit on the 50th anniversary of John Jay
  • mmc: We rolled out the Murder Mystery Challenge for the second year
  • l-etc: I co-chaired the LACUNY Emerging Tech Committee for the second year
  • dc: I worked more on our Digital Collections site, importing materials and refining the UX
  • mla: I went to MLA 2015 in Vancouver and gave a presentation
  • onesearch: We further implemented CUNY’s web-scale discovery service; I organized and ran a usability testing session with my colleagues
  • caug: I began to convene the CollectiveAccess User Group at METRO
  • socialmedia: I became more active on behalf of the library on the @johnjaylibrary Instagram account
  • newsletter: I designed two more biannual issues of Classified Information, our department newsletter
  • drupal, page, fixed, update, added, etc.: I continued to maintain the library’s Drupal-based website

What’s on tap for 2015–16? Lots of online education outreach and much more instruction than I’ve previously done! I’m also starting to flex my writing muscles, starting with a quarterly column in Behavioral & Social Sciences Librarian.